Elin Decompiled Documentation EA 23.102 Nightly
Loading...
Searching...
No Matches
FactionBranch.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using Newtonsoft.Json;
5using UnityEngine;
6
7public class FactionBranch : EClass
8{
9 public class Statistics : EClass
10 {
11 [JsonProperty]
12 public int ship;
13
14 [JsonProperty]
15 public int inn;
16
17 [JsonProperty]
18 public int tourism;
19
20 [JsonProperty]
21 public int shop;
22
23 [JsonProperty]
24 public int numSold;
25
26 [JsonProperty]
27 public int visitor;
28
29 [JsonProperty]
30 public int tax;
31 }
32
33 [JsonProperty]
34 public int lv = 1;
35
36 [JsonProperty]
37 public int rank;
38
39 [JsonProperty]
40 public int exp;
41
42 [JsonProperty]
43 public int seedPlan;
44
45 [JsonProperty]
46 public int temper;
47
48 [JsonProperty]
49 public int uidMaid;
50
51 [JsonProperty]
53
54 [JsonProperty]
55 public int incomeShop;
56
57 [JsonProperty]
58 public bool luckyMonth;
59
60 [JsonProperty]
61 public bool luckyMonthDone;
62
63 [JsonProperty]
65 {
66 value = 1
67 };
68
69 [JsonProperty]
71
72 [JsonProperty]
74
75 [JsonProperty]
77
78 [JsonProperty]
80
81 [JsonProperty]
83
84 [JsonProperty]
85 public Thing stash;
86
87 [JsonProperty]
88 public MsgLog log = new MsgLog
89 {
90 id = "log"
91 };
92
93 [JsonProperty]
95
96 [JsonProperty]
98
99 [JsonProperty]
100 public List<HireInfo> listRecruit = new List<HireInfo>();
101
102 [JsonProperty]
103 public int dateFound;
104
105 [JsonProperty]
106 public int tourism;
107
108 [JsonProperty]
110
111 [JsonProperty]
113
114 public Zone owner;
115
116 public int incomeInn;
117
118 public int incomeTourism;
119
120 public int efficiency = 100;
121
122 public List<Chara> members = new List<Chara>();
123
124 public int Money => resources.money.value;
125
126 public int Worth => resources.worth.value;
127
128 public int NumHeirloom => 4 + Evalue(2120);
129
130 public int MaxAP => 4 + Evalue(2115) + Evalue(3900) * 5 + Evalue(3709) * lv;
131
132 public int MaxPopulation => 5 + Evalue(2204);
133
134 public int MaxSoil => ((int)(Mathf.Sqrt(EClass._map.bounds.Width * EClass._map.bounds.Height) * 3f) + Evalue(2200) * 5) * (100 + Evalue(3700) * 25) / 100;
135
136 public int ContentLV => Mathf.Max(1, lv * 4 + EClass.scene.elomap.GetRoadDist(EClass._zone.x, EClass._zone.y) - 4 + (int)Mathf.Sqrt(Evalue(2706)) * 4);
137
138 public int DangerLV => Mathf.Max(1, ContentLV - (int)Mathf.Sqrt(Evalue(2704)) * 2);
139
140 public bool HasItemProtection => lv >= 3;
141
142 public bool HasNetwork => lv >= 5;
143
144 public bool IsTaxFree => policies.IsActive(2514);
145
146 public string RankText => (0.01f * (float)exp + (float)rank).ToString("F2");
147
148 public string TextLv => lv + " (" + (100f * (float)exp / (float)GetNextExp()).ToString("F1") + ")";
149
150 public bool IsStartBranch => owner.id == "startSite";
151
153
154 public int MaxLv => 7;
155
156 public int GetNextExp(int _lv = -1)
157 {
158 if (_lv == -1)
159 {
160 _lv = lv;
161 }
162 return _lv * _lv * 100 + 100;
163 }
164
165 public int Evalue(int ele)
166 {
168 if (row.category == "policy")
169 {
170 return policies.GetValue(ele);
171 }
172 if (HasNetwork && row.tag.Contains("network"))
173 {
174 return EClass.pc.faction.elements.Value(ele) + elements.Value(ele);
175 }
176 return elements.Value(ele);
177 }
178
179 public int GetProductBonus(Chara c)
180 {
181 if (c.isDead || c.IsPCParty)
182 {
183 return 0;
184 }
185 if (c.memberType == FactionMemberType.Livestock)
186 {
187 return 100;
188 }
189 return Mathf.Max(1, (90 + Evalue(2116) / 2) * efficiency / 100);
190 }
191
192 public void RefreshEfficiency()
193 {
194 int num = 100;
195 int num2 = CountMembers(FactionMemberType.Default);
196 int ration = 0;
197 foreach (Chara member in members)
198 {
199 if (member.memberType != 0 || member.IsPCParty || member.homeBranch == null || member.homeBranch.owner == null)
200 {
201 continue;
202 }
203 foreach (Hobby item in member.ListHobbies())
204 {
205 TryAdd(item);
206 }
207 foreach (Hobby item2 in member.ListWorks())
208 {
209 TryAdd(item2);
210 }
211 }
212 if (num2 > MaxPopulation)
213 {
214 num -= (num2 - MaxPopulation) * 20 * 100 / (100 + 20 * (int)Mathf.Sqrt(ration));
215 }
216 if (efficiency < 0)
217 {
218 efficiency = 0;
219 }
220 efficiency = num;
221 void TryAdd(Hobby h)
222 {
223 if (!h.source.elements.IsEmpty())
224 {
225 for (int i = 0; i < h.source.elements.Length; i += 2)
226 {
227 if (h.source.elements[i] == 2207)
228 {
229 ration += h.source.elements[i + 1];
230 }
231 }
232 }
233 }
234 }
235
236 public void Abandon()
237 {
238 }
239
240 public void OnCreate(Zone zone)
241 {
242 SetOwner(zone);
243 stash = ThingGen.Create("container_salary");
247 }
248
249 public void SetOwner(Zone zone)
250 {
251 owner = zone;
252 resources.SetOwner(this);
253 researches.SetOwner(this);
254 policies.SetOwner(this);
255 happiness.SetOwner(this);
256 expeditions.SetOwner(this);
257 meetings.SetOwner(this);
258 foreach (Chara value in EClass.game.cards.globalCharas.Values)
259 {
260 if (value == null)
261 {
262 Debug.LogError("exception: c==null");
263 }
264 else if (EClass.pc == null)
265 {
266 Debug.LogError("exception: pc==null");
267 }
268 else if (value.homeZone == zone && value.faction == EClass.pc.faction)
269 {
270 members.Add(value);
272 }
273 }
275 }
276
277 public void OnActivateZone()
278 {
279 incomeInn = 0;
280 incomeTourism = 0;
281 foreach (Chara member in members)
282 {
283 if (member.IsAliveInCurrentZone && !member.pos.IsInBounds)
284 {
286 }
288 }
290 }
291
292 public void OnAfterSimulate()
293 {
294 if (!EClass.game.isLoading)
295 {
297 }
298 foreach (Chara chara in EClass._map.charas)
299 {
300 if (!chara.IsPCParty && !chara.noMove)
301 {
302 if ((chara.pos.cell.HasBlock || chara.pos.cell.hasDoor) && !chara.isRestrained && !chara.HasCondition<ConSuspend>())
303 {
304 chara.MoveImmediate(chara.pos.GetNearestPoint(allowBlock: false, allowChara: false) ?? chara.pos);
305 }
307 {
308 EClass.pc.party.AddMemeber(chara, showMsg: true);
309 }
310 }
311 }
312 }
313
314 public void OnUnloadMap()
315 {
316 }
317
318 public void OnSimulateHour(VirtualDate date)
319 {
320 int num = CountMembers(FactionMemberType.Default, onlyAlive: true);
321 int starveChance = Mathf.Max(num - MaxPopulation, 0);
322 members.ForeachReverse(delegate(Chara c)
323 {
324 if (!c.IsPCParty && c.IsAliveInCurrentZone && !c.noMove)
325 {
326 if (EClass.rnd(24 * members.Count) < starveChance)
327 {
328 starveChance--;
329 }
330 else
331 {
332 c.TickWork(date);
333 }
334 if (!date.IsRealTime && EClass.rnd(3) != 0 && c.memberType == FactionMemberType.Default)
335 {
336 c.hunger.Mod(1);
337 if (c.hunger.GetPhase() >= 3)
338 {
339 Thing meal = GetMeal(c);
340 if (meal != null)
341 {
342 FoodEffect.Proc(c, meal);
343 meal.Destroy();
344 }
345 else
346 {
347 c.hunger.Mod(-50);
348 }
349 }
350 }
351 }
352 });
353 expeditions.OnSimulateHour();
354 meetings.OnSimulateHour(date);
355 policies.OnSimulateHour(date);
356 int num2 = Evalue(3707);
357 int num3 = Evalue(3705) + Evalue(3710) * 2;
358 int num4 = 4 + num3 * 4;
359 int num5 = Mathf.Max(1, (100 + Evalue(2205) * 5 + Evalue(3703) * 100 - num2 * 80) / 10);
360 int num6 = 10;
361 if (policies.IsActive(2709))
362 {
363 num6 = 0;
364 }
366 {
367 num5 /= 2;
368 }
369 if ((date.IsRealTime || num2 > 0) && !EClass.debug.enable && EClass.rnd(num5) == 0 && !EClass.pc.IsDeadOrSleeping && EClass._map.CountHostile() < num4)
370 {
371 int num7 = 1 + EClass.rnd(num2 + num3 + 1);
372 for (int i = 0; i < num7; i++)
373 {
374 EClass._zone.SpawnMob(null, SpawnSetting.HomeEnemy(DangerLV));
375 }
376 }
377 if ((date.IsRealTime || num2 == 0) && num6 != 0 && EClass.rnd(num6) == 0 && EClass._map.CountWildAnimal() < num4)
378 {
380 }
381 if (EClass.rnd(5) == 0 && policies.IsActive(2810))
382 {
383 int num8 = 3 + lv + Evalue(2206) / 5 + Evalue(3702) * 2 + Evalue(2202) / 2;
384 num8 = num8 * (100 + Evalue(3702) * 20 + Evalue(2206)) / 100;
385 num8 = num8 * (100 + (int)Mathf.Sqrt(Evalue(2811)) * 3) / 100;
386 if (luckyMonth)
387 {
388 num8 = num8 * 2 + 5;
389 }
390 if (EClass._map.CountGuest() < num8)
391 {
392 Chara chara;
393 if (luckyMonth || (policies.IsActive(2822) && Mathf.Sqrt(Evalue(2822) / 2) + 5f >= (float)EClass.rnd(100)))
394 {
395 chara = CharaGen.CreateWealthy(ContentLV);
397 }
398 else
399 {
400 chara = EClass._zone.SpawnMob(null, SpawnSetting.HomeGuest(ContentLV));
401 }
402 if (chara != null && (chara.id == "nun_mother" || chara.id == "prostitute") && policies.IsActive(2710))
403 {
404 chara.Destroy();
405 chara = null;
406 }
407 if (chara != null)
408 {
409 statistics.visitor++;
410 chara.memberType = FactionMemberType.Guest;
411 chara.SetInt(34, EClass.world.date.GetRaw());
412 chara.c_allowance = chara.LV * 100;
413 if (chara.IsWealthy)
414 {
415 chara.c_allowance *= 10;
416 }
417 if (date.IsRealTime)
418 {
419 Msg.Say("guestArrive", chara.Name);
420 }
421 else
422 {
423 chara.TryAssignBed();
424 }
425 }
426 }
427 }
428 foreach (Chara chara3 in EClass._map.charas)
429 {
430 if (chara3.memberType != FactionMemberType.Guest || ((chara3.c_allowance > 0 || EClass.rnd(2) != 0) && chara3.GetInt(34) + 10080 >= EClass.world.date.GetRaw()))
431 {
432 continue;
433 }
434 foreach (Chara item in EClass._zone.ListMinions(chara3))
435 {
436 item.Destroy();
437 }
438 if (!chara3.IsGlobal)
439 {
440 chara3.Destroy();
441 }
442 chara3.ClearBed();
443 break;
444 }
445 if (date.hour == 5)
446 {
447 for (int j = 0; j < ((!luckyMonth) ? 1 : 2); j++)
448 {
449 DailyOutcome(date);
450 }
451 GenerateGarbage(date);
452 if (!date.IsRealTime)
453 {
454 AutoClean();
455 }
456 CalcTourismIncome();
457 CalcInnIncome();
458 if (date.IsRealTime)
459 {
460 GetDailyIncome();
461 }
462 }
463 if (!EClass.player.simulatingZone && date.hour == 6)
464 {
465 ReceivePackages(date);
466 }
467 if (!date.IsRealTime && date.hour % 8 == 0)
468 {
469 foreach (Chara item2 in EClass._map.charas.Where((Chara c) => c.memberType == FactionMemberType.Guest).ToList())
470 {
471 for (int k = 0; k < 3; k++)
472 {
473 AI_Shopping.TryShop(item2, realtime: false);
474 }
475 }
476 AI_Shopping.TryRestock(EClass.pc, realtime: false);
477 }
478 if (EClass.rnd(24) == 0 || EClass.debug.enable)
479 {
480 foreach (Thing thing in EClass._map.things)
481 {
482 if (EClass.rnd(20) == 0 && thing.trait is TraitFoodEggFertilized && thing.pos.FindThing<TraitBed>() != null)
483 {
484 Chara chara2 = TraitFoodEggFertilized.Incubate(thing, thing.pos);
485 thing.ModNum(-1);
486 if (date.IsRealTime)
487 {
488 chara2.PlaySound("egg");
489 }
490 break;
491 }
492 }
493 }
494 resources.SetDirty();
495 }
496
497 public void AutoClean()
498 {
499 foreach (Chara member in members)
500 {
501 if (member.IsPCParty || !member.ExistsOnMap || member.memberType != 0)
502 {
503 continue;
504 }
505 Hobby hobby = member.GetWork("Clean") ?? member.GetWork("Chore");
506 if (hobby == null)
507 {
508 continue;
509 }
510 int num = (5 + EClass.rnd(5)) * hobby.GetEfficiency(member) / 100;
511 for (int i = 0; i < num; i++)
512 {
513 Thing thingToClean = AI_Haul.GetThingToClean(member);
514 if (thingToClean == null)
515 {
516 break;
517 }
519 }
520 }
521 }
522
523 public void OnSimulateDay(VirtualDate date)
524 {
525 if (owner == null || owner.mainFaction != EClass.Home)
526 {
527 return;
528 }
529 researches.OnSimulateDay();
530 resources.OnSimulateDay();
531 happiness.OnSimulateDay();
532 if (!date.IsRealTime)
533 {
534 BranchMap branchMap = date.GetBranchMap();
535 foreach (Chara member in members)
536 {
537 if (!member.IsPCParty && member.memberType != FactionMemberType.Livestock && !member.faith.IsEyth && !member.c_isPrayed && branchMap.altarMap.Contains(member.faith.id))
538 {
539 AI_Pray.Pray(member, silent: true);
540 }
541 }
542 }
543 foreach (Chara member2 in members)
544 {
545 member2.c_isPrayed = false;
546 member2.c_isTrained = false;
547 }
548 if (date.day != 1)
549 {
550 return;
551 }
552 luckyMonth = false;
553 if (date.month == 1)
554 {
555 luckyMonthDone = false;
556 }
557 if (!luckyMonthDone)
558 {
559 bool flag = EClass.pc.faith == EClass.game.religions.Luck;
560 luckyMonth = (float)(flag ? 30 : 5) + Mathf.Sqrt(Evalue(2118)) * (float)(flag ? 4 : 2) > (float)EClass.rnd(720);
561 if (EClass.debug.enable)
562 {
563 luckyMonth = true;
564 }
565 if (luckyMonth)
566 {
567 Log("lucky_month", EClass._zone.Name);
568 Msg.Say("lucky_month", EClass._zone.Name);
569 Msg.Say("umi");
570 SE.Play("godbless");
571 EClass.world.SendPackage(ThingGen.Create("book_kumiromi"));
572 luckyMonthDone = true;
573 }
574 }
575 }
576
577 public void OnAdvanceDay()
578 {
579 int num = 0;
580 foreach (Chara member in members)
581 {
582 if (!member.IsPC && !member.isDead && member.memberType == FactionMemberType.Default)
583 {
584 if (EClass.rnd(3) == 0)
585 {
586 num++;
587 }
588 if (member.GetWork("Pioneer") != null)
589 {
590 num += 3;
591 }
592 }
593 }
594 ModExp(num);
595 }
596
597 public void OnSimulateMonth(VirtualDate date)
598 {
599 lastStatistics = statistics;
600 statistics = new Statistics();
601 }
602
603 public void GenerateGarbage(VirtualDate date)
604 {
605 int sortChance = 40 + GetCivility();
606 int unsortedCount = 0;
607 foreach (Chara member in members)
608 {
609 if (!member.IsPCParty && member.ExistsOnMap)
610 {
611 Hobby hobby = member.GetWork("Clean") ?? member.GetWork("Chore");
612 if (hobby != null)
613 {
614 sortChance += 20 * hobby.GetEfficiency(member) / 100;
615 }
616 }
617 }
618 int num = Evalue(2702);
619 int num2 = EClass.rnd(2);
620 for (int i = 0; i < num2; i++)
621 {
622 if (num == 0 || EClass.rnd(num + (EClass.debug.enable ? 100000 : 10)) == 0)
623 {
624 Generate(null);
625 }
626 }
627 foreach (Chara member2 in members)
628 {
629 if (!member2.IsPCParty && member2.ExistsOnMap && (num == 0 || EClass.rnd(num + (EClass.debug.enable ? 100000 : 10)) == 0))
630 {
631 Generate(member2);
632 }
633 }
634 void Generate(Chara c)
635 {
636 if (c == null || EClass.rnd(5) == 0)
637 {
638 if (EClass.rnd(80) == 0)
639 {
641 }
642 else if (EClass.rnd(40) == 0)
643 {
644 Thing thing;
645 Add(thing = ThingGen.CreateFromTag("garbage"));
646 }
647 else
648 {
649 string id = "trash2";
650 if (EClass.rnd(3) == 0)
651 {
652 id = "trash1";
653 }
654 if (EClass.rnd(10) == 0)
655 {
656 id = ((EClass.rnd(3) == 0) ? "529" : "1170");
657 }
658 if (c != null && (!c.IsUnique || c.memberType == FactionMemberType.Livestock) && EClass.rnd((c.memberType == FactionMemberType.Livestock) ? 2 : 50) == 0)
659 {
660 id = "_poop";
661 }
662 if (EClass.rnd(200000) == 0)
663 {
664 id = "goodness";
665 }
666 Add(ThingGen.Create(id));
667 }
668 }
669 void Add(Thing t)
670 {
671 if (sortChance < EClass.rnd(100))
672 {
673 EClass._zone.TryAddThing(t, (c != null) ? (c.pos.GetRandomPoint(2) ?? c.pos).GetNearestPoint() : EClass._zone.bounds.GetRandomSurface(), destroyIfFail: true);
674 }
675 else
676 {
677 if (t.id == "_poop" && EClass.rnd(150) == 0)
678 {
679 t.ChangeMaterial((EClass.rnd(2) == 0) ? "silver" : "gold");
680 }
681 if (!TryTrash(t))
682 {
683 unsortedCount++;
684 if (unsortedCount >= 5)
685 {
686 Tutorial.Reserve("garbage");
687 }
688 }
689 }
690 }
691 }
692 }
693
694 public bool TryTrash(Thing t)
695 {
696 Thing thing = ((t.id == "_poop" || t.source._origin == "dish") ? EClass._map.props.installed.FindEmptyContainer<TraitContainerCompost>(t) : (t.isFireproof ? EClass._map.props.installed.FindEmptyContainer<TraitContainerUnburnable>(t) : EClass._map.props.installed.FindEmptyContainer<TraitContainerBurnable>(t)));
697 if (thing != null)
698 {
699 thing.AddCard(t);
700 return true;
701 }
702 return EClass._zone.TryAddThingInSpot<TraitSpotGarbage>(t, useContainer: false);
703 }
704
705 public void ReceivePackages(VirtualDate date)
706 {
708 {
709 return;
710 }
711 List<Thing> listPackage = EClass.game.cards.listPackage;
712 if (EClass.player.stats.days >= 2 && !EClass.player.flags.elinGift && Steam.HasDLC(ID_DLC.BackerReward))
713 {
714 listPackage.Add(ThingGen.Create("gift"));
715 EClass.player.flags.elinGift = true;
716 }
717 if (listPackage.Count == 0)
718 {
719 return;
720 }
721 SE.Play("notice");
722 int num = 0;
723 foreach (Thing item in listPackage)
724 {
725 if (item.id != "bill")
726 {
727 num++;
728 }
729 PutInMailBox(item, item.id == "cardboard_box" || item.id == "gift");
730 WidgetPopText.Say("popDeliver".lang(item.Name));
731 }
732 Msg.Say("deliver_arrive", num.ToString() ?? "");
733 listPackage.Clear();
734 }
735
736 public void DailyOutcome(VirtualDate date)
737 {
738 Thing thing = null;
739 foreach (Chara member in members)
740 {
741 Chara i = member;
742 if (EClass.rnd(EClass.debug.enable ? 2 : (360 * members.Count)) == 0 && !i.IsPC && EClass.pc.faction.IsGlobalPolicyActive(2712) && i.things.Find((Thing t) => t.id == "panty" && t.c_idRefCard == i.id) == null && !i.things.IsFull())
743 {
744 Thing thing2 = ThingGen.Create("panty");
745 thing2.c_idRefCard = i.id;
746 i.AddThing(thing2);
747 }
748 if (i.IsPCParty || !i.ExistsOnMap)
749 {
750 continue;
751 }
752 i.RefreshWorkElements(elements);
753 if (i.memberType == FactionMemberType.Livestock)
754 {
755 if (thing == null)
756 {
757 thing = EClass._map.Stocked.Find("pasture", -1, -1, shared: true) ?? EClass._map.Installed.Find("pasture");
758 }
759 if (thing == null)
760 {
761 continue;
762 }
763 if (i.race.breeder >= EClass.rnd(2500 - (int)Mathf.Sqrt(Evalue(2827) * 100)))
764 {
765 if (EClass.rnd(3) != 0)
766 {
767 Thing t2 = i.MakeEgg(date.IsRealTime, 1, date.IsRealTime);
768 if (!date.IsRealTime)
769 {
770 i.TryPutShared(t2);
771 }
772 }
773 else
774 {
775 Thing t3 = i.MakeMilk(date.IsRealTime, 1, date.IsRealTime);
776 if (!date.IsRealTime)
777 {
778 i.TryPutShared(t3);
779 }
780 }
781 }
782 if (i.HaveFur())
783 {
784 i.c_fur++;
785 }
786 thing.ModNum(-1);
787 if (thing.isDestroyed || thing.Num == 0)
788 {
789 thing = null;
790 }
791 continue;
792 }
793 foreach (Hobby item in i.ListHobbies())
794 {
795 GetOutcome(item);
796 }
797 foreach (Hobby item2 in i.ListWorks())
798 {
799 GetOutcome(item2);
800 }
801 void GetOutcome(Hobby h)
802 {
803 int num3 = h.GetEfficiency(i) * GetProductBonus(i) / 100;
804 int num4 = h.GetLv(i);
805 int id = EClass.sources.elements.alias[h.source.skill].id;
806 if (!i.elements.HasBase(id))
807 {
808 i.elements.SetBase(id, 1);
809 }
810 i.ModExp(id, 100);
811 for (int j = 0; j < h.source.things.Length; j += 2)
812 {
813 string text = h.source.things[j];
814 int num5 = Mathf.Max(1, h.source.things[j + 1].ToInt() * num3 / 1000);
815 int num6 = num5 / 1000;
816 if (num5 % 1000 > EClass.rnd(1000))
817 {
818 num6++;
819 }
820 if (num6 != 0)
821 {
822 if (!(text == "_egg"))
823 {
824 if (text == "milk")
825 {
826 i.MakeMilk(date.IsRealTime, num6);
827 }
828 else
829 {
830 Thing thing4 = ((!text.StartsWith("#")) ? ThingGen.Create(h.source.things[j], -1, num4) : ThingGen.CreateFromCategory(text.Replace("#", ""), num4));
831 if (thing4 != null)
832 {
833 if (!thing4.trait.CanStack)
834 {
835 num6 = 1;
836 }
837 thing4.SetNum(thing4.trait.CraftNum * num6);
838 thing4.SetBlessedState(BlessedState.Normal);
839 thing4.TryMakeRandomItem(num4);
840 if (thing4.IsAmmo)
841 {
842 thing4.ChangeMaterial("iron");
843 thing4.c_IDTState = 0;
844 }
845 bool flag = thing4.category.id == "garbage";
846 if (thing4.trait is TraitFoodMeal)
847 {
848 if (thing4.HasTag(CTAG.dish_fail))
849 {
850 flag = true;
851 }
852 else
853 {
854 CraftUtil.MakeDish(thing4, num4 + 10, i);
855 }
856 }
857 if (flag)
858 {
859 TryTrash(thing4);
860 }
861 else
862 {
863 i.TryPutShared(thing4);
864 }
865 }
866 }
867 }
868 else
869 {
870 i.MakeEgg(date.IsRealTime, num6);
871 }
872 }
873 }
874 switch (h.source.alias)
875 {
876 case "Nurse":
877 {
878 foreach (Chara member2 in members)
879 {
880 if (!member2.IsPCParty)
881 {
882 if (member2.isDead && member2.CanRevive() && EClass.rnd(num3) > EClass.rnd(100))
883 {
884 Log("bNurse", i, member2);
885 member2.Revive(member2.pos, msg: true);
886 if (date.IsRealTime && member2.c_wasInPcParty)
887 {
888 EClass.pc.party.AddMemeber(member2, showMsg: true);
889 }
890 break;
891 }
892 if (EClass.rnd(num3) > EClass.rnd(100))
893 {
894 member2.CureHost(CureType.HealComplete);
895 }
896 }
897 }
898 break;
899 }
900 case "Chore":
901 case "Clean":
902 {
903 for (int k = 0; k < num3 / 2; k++)
904 {
905 Point randomPoint = EClass._map.bounds.GetRandomPoint();
906 if (randomPoint.HasDecal)
907 {
908 EClass._map.SetDecal(randomPoint.x, randomPoint.z);
909 }
910 }
911 break;
912 }
913 case "TreasureHunt":
914 if (EClass.rnd(num3) > EClass.rnd(EClass.debug.enable ? 100 : 5000))
915 {
917 if (thing5 != null)
918 {
919 Thing thing6 = ThingGen.CreateTreasure("chest_treasure", thing5.LV);
920 i.TryPutShared(thing6);
921 thing5.Destroy();
922 WidgetPopText.Say("foundTreasure".lang(thing6.Name));
923 }
924 }
925 break;
926 }
927 }
928 }
929 int soilCost = EClass._zone.GetSoilCost();
930 int num = Mathf.Min(100, 70 + (MaxSoil - soilCost));
931 int flower = 5;
932 int lv = 1;
933 EClass._map.bounds.ForeachCell(delegate(Cell cell)
934 {
935 if (cell.obj != 0 && cell.sourceObj.tag.Contains("flower"))
936 {
937 PlantData plantData = cell.TryGetPlant();
938 if (plantData != null && plantData.seed != null)
939 {
940 lv += plantData.seed.encLV + 1;
941 }
942 else
943 {
944 lv++;
945 }
946 flower++;
947 }
948 });
949 lv /= flower;
950 int num2 = 0;
951 foreach (Thing thing7 in EClass._map.things)
952 {
953 if (thing7.IsInstalled && thing7.trait is TraitBeekeep && !thing7.things.IsFull())
954 {
955 flower -= 3 + EClass.rnd(5 + num2 * 4);
956 num2++;
957 if (flower < 0)
958 {
959 break;
960 }
961 if (EClass.rnd(100) <= num)
962 {
963 Thing thing3 = ThingGen.Create("honey");
964 thing3.SetEncLv(lv / 10);
965 thing3.elements.SetBase(2, EClass.curve(lv, 50, 10, 80));
966 thing7.AddThing(thing3);
967 }
968 }
969 }
970 }
971
972 public void PutInMailBox(Thing t, bool outside = false, bool install = true)
973 {
974 if (!outside)
975 {
976 Thing mailBox = GetMailBox();
977 if (mailBox != null)
978 {
979 mailBox.AddCard(t);
980 return;
981 }
982 }
983 Point mailBoxPos = GetMailBoxPos();
984 EClass._zone.AddCard(t, mailBoxPos);
985 if (install)
986 {
987 t.Install();
988 }
989 }
990
992 {
993 return EClass._map.props.installed.FindEmptyContainer<TraitMailPost>();
994 }
995
997 {
998 Thing thing = GetMailBox();
999 if (thing == null)
1000 {
1002 }
1003 if (thing != null)
1004 {
1005 return thing.pos.GetNearestPoint(allowBlock: false, allowChara: true, allowInstalled: false, ignoreCenter: true).Clamp(useBounds: true);
1006 }
1007 return EClass._map.GetCenterPos();
1008 }
1009
1010 public int GetResidentTax()
1011 {
1012 if (!policies.IsActive(2512, 30))
1013 {
1014 return 0;
1015 }
1016 int num = 0;
1017 int num2 = (policies.IsActive(2500, 30) ? Evalue(2500) : 0);
1018 int num3 = (policies.IsActive(2501, 30) ? Evalue(2501) : 0);
1019 int num4 = 50 + (int)Mathf.Sqrt(Evalue(2512)) * 5;
1020 foreach (Chara member in members)
1021 {
1022 if (member.IsPC || member.memberType != 0)
1023 {
1024 continue;
1025 }
1026 bool isWealthy = member.IsWealthy;
1027 int num5 = 0;
1028 foreach (Hobby item in member.ListWorks().Concat(member.ListHobbies()))
1029 {
1030 int num6 = item.source.tax * 100 / 100;
1031 if (num6 > num5)
1032 {
1033 num5 = num6;
1034 }
1035 }
1036 int num7 = ((isWealthy ? 50 : 10) + member.LV * 2) * num5 / 100 * num4 / 100;
1037 if (isWealthy && num2 > 0)
1038 {
1039 num7 = num7 * (150 + (int)Mathf.Sqrt(num2) * 5) / 100;
1040 }
1041 if (num3 > 0)
1042 {
1043 num7 += (80 + (int)Mathf.Sqrt(num3) * 5) * member.faith.source.tax / 100;
1044 }
1045 num7 = num7 * efficiency / (IsTaxFree ? 100 : 1000);
1046 num += num7;
1047 if (num7 > 0)
1048 {
1049 Log("bTax", num7.ToString() ?? "", member.Name);
1050 }
1051 }
1052 statistics.tax += num;
1053 return num;
1054 }
1055
1056 public void CalcInnIncome()
1057 {
1058 int num = CountGuests();
1059 if (num == 0)
1060 {
1061 return;
1062 }
1063 int num2 = 0;
1064 int num3 = 0;
1065 foreach (Thing thing in EClass._map.things)
1066 {
1067 if (thing.IsInstalled && thing.trait is TraitBed traitBed && traitBed.owner.c_bedType == BedType.guest)
1068 {
1069 int maxHolders = traitBed.MaxHolders;
1070 num2 += maxHolders;
1071 num3 += traitBed.owner.LV * (100 + traitBed.owner.Quality / 2 + traitBed.owner.Evalue(750) / 2) / 100 * maxHolders;
1072 }
1073 }
1074 num = Mathf.Min(num, num2);
1075 if (num != 0)
1076 {
1077 num3 /= num2;
1078 num3 = num3 * (100 + 5 * (int)Mathf.Sqrt(Evalue(2812))) / 100;
1079 float num4 = 10f + Mathf.Sqrt(num) * 10f;
1080 if (policies.IsActive(2813))
1081 {
1082 num4 += Mathf.Sqrt(CountWealthyGuests()) * 50f * (80f + 5f * Mathf.Sqrt(Evalue(2813))) / 100f;
1083 }
1084 if (policies.IsActive(2812))
1085 {
1086 num4 = num4 * (float)(100 + num3) / 100f;
1087 }
1088 num4 = Mathf.Min(num4, Mathf.Sqrt(Worth) / 15f + 5f);
1089 incomeInn += EClass.rndHalf((int)num4) + EClass.rndHalf((int)num4);
1090 }
1091 }
1092
1093 public void CalcTourismIncome()
1094 {
1095 int num = CountGuests();
1096 if (num != 0)
1097 {
1098 float num2 = 10f + Mathf.Sqrt(num) * 10f;
1099 if (policies.IsActive(2815))
1100 {
1101 num2 += Mathf.Sqrt(CountWealthyGuests()) * 50f * (80f + 5f * Mathf.Sqrt(Evalue(2815))) / 100f;
1102 }
1103 num2 = Mathf.Min(num2, Mathf.Sqrt(tourism) / 5f);
1104 incomeTourism += EClass.rndHalf((int)num2) + EClass.rndHalf((int)num2);
1105 }
1106 }
1107
1108 public void GetDailyIncome()
1109 {
1110 GetIncome(ref incomeShop, ref statistics.shop, "getIncomeShop", tax: false);
1111 GetIncome(ref incomeInn, ref statistics.inn, "getIncomeInn", tax: true);
1112 GetIncome(ref incomeTourism, ref statistics.tourism, "getIncomeTourism", tax: true);
1113 void GetIncome(ref int n, ref int stat, string lang, bool tax)
1114 {
1115 if (tax && !IsTaxFree)
1116 {
1117 n = n * 10 / 100;
1118 }
1119 if (n != 0)
1120 {
1121 Msg.Say(lang, Lang._currency(n, "money"), owner.Name);
1122 Thing t = ThingGen.Create("money").SetNum(n);
1123 EClass.pc.Pick(t);
1124 stat += n;
1125 n = 0;
1126 }
1127 }
1128 }
1129
1131 {
1132 if (c.things.IsFull())
1133 {
1134 return null;
1135 }
1136 Thing thing = EClass._zone.TryGetThingFromSharedContainer((Thing t) => c.CanEat(t, shouldEat: true) && !t.c_isImportant);
1137 if (thing != null)
1138 {
1139 thing = thing.Split(1);
1140 }
1141 return thing;
1142 }
1143
1144 public void OnClaimZone()
1145 {
1147 {
1148 foreach (SourceElement.Row item in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "tech"))
1149 {
1150 elements.SetBase(item.id, 1);
1151 }
1152 foreach (SourceElement.Row item2 in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "policy" && !a.tag.Contains("hidden")))
1153 {
1154 policies.AddPolicy(item2.id);
1155 }
1156 }
1157 else
1158 {
1159 elements.SetBase(2003, 1);
1160 elements.SetBase(4002, 1);
1161 elements.SetBase(2115, 1);
1162 elements.SetBase(2204, 1);
1163 elements.SetBase(2120, 1);
1164 policies.AddPolicy(2512);
1165 policies.AddPolicy(2702);
1166 policies.AddPolicy(2703);
1167 policies.AddPolicy(2516);
1168 policies.AddPolicy(2515);
1169 policies.AddPolicy(2514);
1170 }
1172 {
1173 policies.Activate(2514);
1174 }
1175 Element element = EClass._zone.ListLandFeats()[0];
1176 elements.SetBase(element.id, 1);
1177 switch (element.id)
1178 {
1179 case 3604:
1180 elements.SetBase(2206, 10);
1181 break;
1182 case 3602:
1183 elements.SetBase(2206, 15);
1184 break;
1185 }
1186 if (EClass.game.StartZone == owner || owner is Zone_Vernis)
1187 {
1188 AddMemeber(EClass.pc);
1189 }
1191 {
1192 foreach (SourceElement.Row item3 in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "policy"))
1193 {
1194 policies.AddPolicy(item3.id);
1195 }
1196 }
1197 ValidateUpgradePolicies();
1198 }
1199
1200 public void OnUnclaimZone()
1201 {
1202 List<Element> list = owner.ListLandFeats();
1203 elements.SetBase(list[1].id, 0);
1204 elements.SetBase(list[2].id, 0);
1205 if (lv < 5)
1206 {
1207 return;
1208 }
1209 foreach (Element item in list.Where((Element a) => a.HasTag("network")).ToList())
1210 {
1212 }
1213 }
1214
1216 {
1217 if (lv >= 2)
1218 {
1219 if (!policies.HasPolicy(2705))
1220 {
1221 policies.AddPolicy(2705);
1223 }
1224 if (!policies.HasPolicy(2708))
1225 {
1226 policies.AddPolicy(2708);
1228 }
1229 if (!policies.HasPolicy(2707))
1230 {
1231 policies.AddPolicy(2707);
1232 }
1233 if (!policies.HasPolicy(2709))
1234 {
1235 policies.AddPolicy(2709);
1236 }
1237 if (!policies.HasPolicy(2715))
1238 {
1239 policies.AddPolicy(2715);
1240 }
1241 }
1242 foreach (int globalPolicy in EClass.pc.faction.globalPolicies)
1243 {
1244 if (!policies.HasPolicy(globalPolicy))
1245 {
1246 policies.AddPolicy(globalPolicy, show: false);
1248 }
1249 }
1250 }
1251
1252 public void Upgrade()
1253 {
1254 List<Element> list = owner.ListLandFeats();
1255 if (owner.IsActiveZone)
1256 {
1257 TraitCoreZone traitCoreZone = EClass._map.FindThing<TraitCoreZone>();
1258 if (traitCoreZone != null)
1259 {
1260 SE.Play("godbless");
1261 traitCoreZone.owner.PlayEffect("aura_heaven");
1262 }
1263 }
1264 lv++;
1265 exp = 0;
1266 int admin = 4;
1267 int food = 4;
1268 Set(4, 3);
1269 switch (list[0].id)
1270 {
1271 case 3500:
1272 Set(5, 3);
1273 break;
1274 case 3604:
1275 Set(4, 3);
1276 break;
1277 case 3600:
1278 Set(5, 3);
1279 break;
1280 case 3601:
1281 Set(4, 4);
1282 break;
1283 case 3603:
1284 Set(6, 2);
1285 break;
1286 case 3602:
1287 Set(5, 2);
1288 break;
1289 }
1290 elements.SetBase(2003, Mathf.Min((lv - 1) * 2 + 1, 10));
1291 elements.SetBase(2115, (lv - 1) * admin + 1);
1292 elements.SetBase(2204, (lv - 1) * food + 1);
1293 elements.GetElement(2003).CheckLevelBonus(elements);
1294 ValidateUpgradePolicies();
1295 if (lv == 4)
1296 {
1297 elements.SetBase(list[1].id, 1);
1298 }
1299 if (lv == 7)
1300 {
1301 elements.SetBase(list[2].id, 1);
1302 }
1303 if (lv >= 5)
1304 {
1305 List<Element> list2 = elements.dict.Values.Where((Element a) => a.source.category == "landfeat" && a.HasTag("network")).ToList();
1306 foreach (Element item in list2)
1307 {
1309 }
1310 foreach (Element item2 in list2)
1311 {
1312 elements.Remove(item2.id);
1313 }
1314 }
1315 Msg.Say("upgrade_hearth", lv.ToString() ?? "", owner.Name);
1316 LogRaw("upgrade_hearth".langGame(lv.ToString() ?? "", owner.Name), "Good");
1317 Tutorial.Reserve("stone");
1318 void Set(int a, int f)
1319 {
1320 admin = a;
1321 food = f;
1322 }
1323 }
1324
1325 public bool CanUpgrade()
1326 {
1327 if (lv < MaxLv)
1328 {
1329 if (exp < GetNextExp())
1330 {
1331 return EClass.debug.enable;
1332 }
1333 return true;
1334 }
1335 return false;
1336 }
1337
1338 public int GetUpgradeCost()
1339 {
1340 return lv * lv * lv * 1000;
1341 }
1342
1343 public void ModExp(int a)
1344 {
1345 if (policies.IsActive(2515))
1346 {
1347 return;
1348 }
1349 if (policies.IsActive(2516))
1350 {
1351 a = a * 150 / 100 + EClass.rnd(2);
1352 }
1353 exp += a;
1354 if (exp >= GetNextExp() && CanUpgrade())
1355 {
1356 if (EClass.core.version.demo && lv >= 3)
1357 {
1358 exp = 0;
1359 Msg.Say("demoLimit2");
1360 }
1361 else
1362 {
1363 Upgrade();
1364 }
1365 }
1366 }
1367
1368 public string GetHearthHint(int a)
1369 {
1370 if (a <= 1)
1371 {
1372 return "hearth1".lang();
1373 }
1374 string text = "";
1375 for (int i = 1; i < a; i++)
1376 {
1377 string text2 = ("hearth" + (i + 1)).lang();
1378 if (!text2.IsEmpty())
1379 {
1380 text = text + text2 + Environment.NewLine;
1381 }
1382 }
1383 return text.TrimEnd(Environment.NewLine.ToCharArray());
1384 }
1385
1386 public void AddFeat(int ele, int v)
1387 {
1388 elements.ModBase(ele, v);
1389 WidgetPopText.Say("rewardElement".lang(EClass.sources.elements.map[ele].GetName()));
1390 }
1391
1392 public void AddMemeber(Chara c)
1393 {
1394 if (!members.Contains(c))
1395 {
1398 c.SetGlobal();
1400 c.SetHomeZone(owner);
1401 if (c.OriginalHostility <= Hostility.Ally)
1402 {
1403 c.c_originalHostility = Hostility.Ally;
1404 }
1405 c.hostility = Hostility.Ally;
1406 c.enemy = null;
1407 c.orgPos = null;
1408 if (c.memberType != 0 && c.memberType != FactionMemberType.Livestock)
1409 {
1410 c.memberType = FactionMemberType.Default;
1411 }
1412 if (c.hp > c.MaxHP)
1413 {
1414 c.hp = c.MaxHP;
1415 }
1416 if (c.mana.value > c.mana.max)
1417 {
1418 c.mana.value = c.mana.max;
1419 }
1420 if (c.stamina.value > c.stamina.max)
1421 {
1422 c.stamina.value = c.stamina.max;
1423 }
1424 members.Add(c);
1426 RefreshEfficiency();
1427 c.RefreshWorkElements(elements);
1428 if (uidMaid == 0 && c.id == "maid")
1429 {
1430 uidMaid = c.uid;
1431 }
1432 }
1433 }
1434
1436 {
1437 c.ClearBed();
1438 c.memberType = type;
1439 c.c_wasInPcParty = false;
1440 RefreshEfficiency();
1441 c.RefreshWorkElements(elements);
1442 policies.Validate();
1443 }
1444
1445 public void BanishMember(Chara c, bool skipMsg = false)
1446 {
1447 RemoveMemeber(c);
1448 if (!skipMsg)
1449 {
1450 Msg.Say("banish", c, EClass._zone.Name);
1451 }
1452 if (c.IsGlobal)
1453 {
1454 c.OnBanish();
1455 }
1456 else
1457 {
1458 c.Destroy();
1459 }
1460 }
1461
1462 public void RemoveMemeber(Chara c)
1463 {
1464 c.isSale = false;
1465 if (c.currentZone != null && c.currentZone.map != null)
1466 {
1468 c.currentZone.map.props.sales.Remove(c);
1469 }
1471 c.RemoveGlobal();
1472 members.Remove(c);
1475 policies.Validate();
1476 RefreshEfficiency();
1477 }
1478
1480 {
1481 float num = 0f;
1482 if (members.Count == 0)
1483 {
1484 return 0;
1485 }
1486 foreach (Chara member in members)
1487 {
1488 num += (float)member.happiness;
1489 }
1490 return (int)(num / (float)members.Count);
1491 }
1492
1493 public bool IsAllDead()
1494 {
1495 foreach (Chara member in members)
1496 {
1497 if (!member.isDead)
1498 {
1499 return false;
1500 }
1501 }
1502 return true;
1503 }
1504
1505 public void Recruit(Chara c)
1506 {
1507 RemoveRecruit(c);
1508 AddMemeber(c);
1509 c.isRestrained = false;
1510 if (c.currentZone != EClass._zone && !c.isDead)
1511 {
1513 EClass._zone.AddCard(c, point);
1514 }
1515 RefreshEfficiency();
1517 Msg.Say("hire".langGame(c.Name));
1518 }
1519
1521 {
1522 foreach (Chara member in members)
1523 {
1524 if (member.IsAliveInCurrentZone && member.IsMaid)
1525 {
1526 return member;
1527 }
1528 }
1529 return null;
1530 }
1531
1532 public string GetRandomName()
1533 {
1534 if (EClass.rnd(4) == 0 || members.Count == 0)
1535 {
1536 return EClass.player.title;
1537 }
1538 return members.RandomItem().Name;
1539 }
1540
1541 public int CountMembers(FactionMemberType type, bool onlyAlive = false)
1542 {
1543 int num = 0;
1544 foreach (Chara member in members)
1545 {
1546 if (member.memberType == type && (!onlyAlive || !member.isDead) && (type != 0 || member.trait.IsCountAsResident))
1547 {
1548 num++;
1549 }
1550 }
1551 return num;
1552 }
1553
1554 public int CountGuests()
1555 {
1556 int num = 0;
1557 foreach (Chara chara in EClass._map.charas)
1558 {
1559 if (chara.memberType == FactionMemberType.Guest)
1560 {
1561 num++;
1562 }
1563 }
1564 return num;
1565 }
1566
1568 {
1569 int num = 0;
1570 foreach (Chara chara in EClass._map.charas)
1571 {
1572 if (chara.memberType == FactionMemberType.Guest && chara.IsWealthy)
1573 {
1574 num++;
1575 }
1576 }
1577 return num;
1578 }
1579
1580 public void UpdateReqruits(bool clear = false)
1581 {
1582 resources.Refresh();
1583 if (clear)
1584 {
1585 listRecruit.ForeachReverse(delegate(HireInfo i)
1586 {
1587 if (!i.chara.IsGlobal)
1588 {
1589 i.chara.Destroy();
1590 }
1591 if (i.chara.isDestroyed)
1592 {
1593 listRecruit.Remove(i);
1594 }
1595 });
1596 listRecruit.Clear();
1597 lastUpdateReqruit = -1;
1598 }
1599 else
1600 {
1601 listRecruit.ForeachReverse(delegate(HireInfo i)
1602 {
1603 if (i.Hours < 0)
1604 {
1605 if (!i.chara.IsGlobal)
1606 {
1607 i.chara.Destroy();
1608 }
1609 listRecruit.Remove(i);
1610 }
1611 });
1612 }
1613 if (lastUpdateReqruit == EClass.world.date.day)
1614 {
1615 return;
1616 }
1617 lastUpdateReqruit = EClass.world.date.day;
1618 int num = 2 + (int)Mathf.Sqrt(Evalue(2513)) / 2;
1619 int num2 = EClass.rnd(3 + (int)Mathf.Sqrt(Evalue(2513)) / 2) + num - listRecruit.Count;
1620 if (num2 <= 0)
1621 {
1622 return;
1623 }
1624 new List<Chara>(EClass.game.cards.globalCharas.Values).Shuffle();
1625 for (int j = 0; j < num2; j++)
1626 {
1627 Chara chara = CharaGen.CreateFromFilter("c_neutral", ContentLV + Mathf.Min(EClass.player.stats.days, 10));
1628 if (chara.isBackerContent || chara.source.quality != 0)
1629 {
1630 j--;
1631 }
1632 else
1633 {
1634 AddRecruit(chara);
1635 }
1636 }
1637 }
1638
1639 public void AddRecruit(Chara c)
1640 {
1641 HireInfo hireInfo = new HireInfo
1642 {
1643 chara = c,
1644 isNew = true
1645 };
1646 hireInfo.deadline = EClass.world.date.GetRaw() + (EClass.rnd(5) + 1) * 1440 + EClass.rnd(24) * 60;
1647 listRecruit.Add(hireInfo);
1648 }
1649
1650 public void RemoveRecruit(Chara c)
1651 {
1652 listRecruit.ForeachReverse(delegate(HireInfo i)
1653 {
1654 if (i.chara == c)
1655 {
1656 listRecruit.Remove(i);
1657 }
1658 });
1659 }
1660
1661 public int CountNewRecruits()
1662 {
1663 int num = 0;
1664 foreach (HireInfo item in listRecruit)
1665 {
1666 if (item.isNew)
1667 {
1668 num++;
1669 }
1670 }
1671 return num;
1672 }
1673
1674 public void ClearNewRecruits()
1675 {
1676 foreach (HireInfo item in listRecruit)
1677 {
1678 item.isNew = false;
1679 }
1680 }
1681
1682 public bool IsRecruit(Chara c)
1683 {
1684 foreach (HireInfo item in listRecruit)
1685 {
1686 if (item.chara == c)
1687 {
1688 return true;
1689 }
1690 }
1691 return false;
1692 }
1693
1694 public int CountPasture()
1695 {
1696 return EClass._map.Stocked.GetNum("pasture", onlyShared: true) + EClass._map.Installed.GetNum("pasture");
1697 }
1698
1699 public int GetPastureCost()
1700 {
1701 return CountMembers(FactionMemberType.Livestock);
1702 }
1703
1704 public int GetCivility()
1705 {
1706 int num = 10 + Evalue(2203);
1707 if (Evalue(2701) > 0)
1708 {
1709 num += 10 + (int)Mathf.Sqrt(Evalue(2701));
1710 }
1711 if (Evalue(2702) > 0)
1712 {
1713 num -= 10 + (int)Mathf.Sqrt(Evalue(2702));
1714 }
1715 return num;
1716 }
1717
1718 public float GetHearthIncome()
1719 {
1720 float num = 0f;
1721 foreach (Element value in elements.dict.Values)
1722 {
1723 if (value.source.category == "culture")
1724 {
1725 num += GetHearthIncome(value.source.alias);
1726 }
1727 }
1728 return num;
1729 }
1730
1731 public float GetHearthIncome(string id)
1732 {
1733 int num = 0;
1734 foreach (KeyValuePair<int, Element> item in elements.dict)
1735 {
1736 if (item.Value.source.aliasParent == id)
1737 {
1738 num++;
1739 }
1740 }
1741 return 0.2f * (float)num;
1742 }
1743
1745 {
1746 int valueWithoutLink = e.ValueWithoutLink;
1747 valueWithoutLink += e.CostLearn;
1748 if (e.source.max != 0 && e.ValueWithoutLink >= e.source.max)
1749 {
1750 return 0;
1751 }
1752 return valueWithoutLink;
1753 }
1754
1755 public string Log(string idLang, string ref1 = null, string ref2 = null, string ref3 = null, string ref4 = null)
1756 {
1757 Msg.alwaysVisible = true;
1758 return LogRaw(Msg.GetRawText(idLang, ref1, ref2, ref3, ref4), EClass.sources.langGame.map[idLang].logColor);
1759 }
1760
1761 public string Log(string idLang, Card c1, Card c2, string ref1 = null, string ref2 = null)
1762 {
1763 Msg.alwaysVisible = true;
1764 return LogRaw(Msg.GetRawText(idLang, c1, c2, ref1, ref2), EClass.sources.langGame.map[idLang].logColor);
1765 }
1766
1767 public string Log(string idLang, Card c1, string ref1 = null, string ref2 = null, string ref3 = null)
1768 {
1769 Msg.alwaysVisible = true;
1770 return LogRaw(Msg.GetRawText(idLang, c1, ref1, ref2, ref3), EClass.sources.langGame.map[idLang].logColor);
1771 }
1772
1773 public string LogRaw(string text, string col = null)
1774 {
1775 log.Add(text, col.IsEmpty() ? null : col);
1776 Msg.alwaysVisible = false;
1777 Msg.SetColor();
1778 return text;
1779 }
1780}
BedType
Definition: BedType.cs:2
BlessedState
Definition: BlessedState.cs:2
CTAG
Definition: CTAG.cs:2
@ tourism
CureType
Definition: CureType.cs:2
FactionMemberType
Hostility
Definition: Hostility.cs:2
ID_DLC
Definition: ID_DLC.cs:2
SpawnPosition
Definition: SpawnPosition.cs:2
if(item3.idFile==idFirstFile &&item3.id==idFirstTopic)
Definition: UIBook.cs:627
list. Add(item3)
static Thing GetThingToClean(Chara c=null)
Definition: AI_Haul.cs:34
static void Pray(Chara c, bool silent=false)
Definition: AI_Pray.cs:52
static bool TryRestock(Chara c, bool realtime)
Definition: AI_Shopping.cs:94
static bool TryShop(Chara c, bool realtime)
Definition: AI_Shopping.cs:10
void Add(Act a, string s="")
Definition: ActPlan.cs:11
int GetInt(int id, int? defaultInt=null)
Definition: BaseCard.cs:25
void SetInt(int id, int value=0)
Definition: BaseCard.cs:39
Version version
Definition: BaseCore.cs:17
GlobalCharaList globalCharas
Definition: CardManager.cs:46
List< Thing > listPackage
Definition: CardManager.cs:61
Definition: Card.cs:11
bool isDestroyed
Definition: Card.cs:71
bool IsAmmo
Definition: Card.cs:2107
Thing Split(int a)
Definition: Card.cs:3231
ElementContainerCard elements
Definition: Card.cs:37
bool c_wasInPcParty
Definition: Card.cs:972
string id
Definition: Card.cs:31
bool IsUnique
Definition: Card.cs:1967
bool isRestrained
Definition: Card.cs:538
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:5404
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:2838
Card AddCard(Card c)
Definition: Card.cs:2887
Thing AddThing(string id, int lv=-1)
Definition: Card.cs:2901
int hp
Definition: Card.cs:226
string Name
Definition: Card.cs:2013
bool ExistsOnMap
Definition: Card.cs:1961
bool c_isPrayed
Definition: Card.cs:1032
Thing SetNum(int a)
Definition: Card.cs:3242
virtual void SetBlessedState(BlessedState s)
Definition: Card.cs:3572
bool HasTag(CTAG tag)
Definition: Card.cs:2455
Point pos
Definition: Card.cs:55
int uid
Definition: Card.cs:118
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:5438
Trait trait
Definition: Card.cs:49
int c_allowance
Definition: Card.cs:1253
void SetEncLv(int a)
Definition: Card.cs:3567
void Destroy()
Definition: Card.cs:4538
bool c_isImportant
Definition: Card.cs:984
bool noMove
Definition: Card.cs:742
bool HaveFur()
Definition: Card.cs:6982
ThingContainer things
Definition: Card.cs:34
bool IsInstalled
Definition: Card.cs:2241
BedType c_bedType
Definition: Card.cs:900
void MoveImmediate(Point p, bool focus=true, bool cancelAI=true)
Definition: Card.cs:5127
Thing TryMakeRandomItem(int lv=-1)
Definition: Card.cs:4861
Card Install()
Definition: Card.cs:3448
int Num
Definition: Card.cs:154
void ModNum(int a, bool notify=true)
Definition: Card.cs:3262
int c_fur
Definition: Card.cs:1265
int LV
Definition: Card.cs:370
bool isBackerContent
Definition: Card.cs:885
string c_idRefCard
Definition: Card.cs:1637
void RemoveThings()
Definition: Card.cs:3056
Definition: Cell.cs:7
bool HasBlock
Definition: Cell.cs:643
byte obj
Definition: Cell.cs:38
SourceObj.Row sourceObj
Definition: Cell.cs:1072
bool hasDoor
Definition: Cell.cs:258
static Chara CreateWealthy(int lv=-1)
Definition: CharaGen.cs:53
static Chara CreateFromFilter(string id, int lv=-1, int levelRange=-1)
Definition: CharaGen.cs:22
Definition: Chara.cs:10
void SetHomeZone(Zone zone)
Definition: Chara.cs:1234
override bool IsAliveInCurrentZone
Definition: Chara.cs:546
new TraitChara trait
Definition: Chara.cs:488
Hostility OriginalHostility
Definition: Chara.cs:456
void RemoveGlobal()
Definition: Chara.cs:1294
void SetFaction(Faction f)
Definition: Chara.cs:1227
bool IsWealthy
Definition: Chara.cs:878
bool CanRevive()
Definition: Chara.cs:4623
void TryPutShared(Thing t, List< Thing > containers=null, bool dropIfFail=true)
Definition: Chara.cs:4054
void CureHost(CureType type, int p=100, BlessedState state=BlessedState.Normal)
Definition: Chara.cs:8634
void RefreshWorkElements(ElementContainer parent=null)
Definition: Chara.cs:8175
Faction faction
Definition: Chara.cs:412
override bool IsPC
Definition: Chara.cs:597
bool IsMaid
Definition: Chara.cs:850
override bool IsGlobal
Definition: Chara.cs:595
override bool IsPCParty
Definition: Chara.cs:600
Party party
Definition: Chara.cs:43
TraitBed TryAssignBed()
Definition: Chara.cs:6641
bool HasCondition(string alias)
Definition: Chara.cs:8568
int happiness
Definition: Chara.cs:105
Chara SetGlobal(Zone _home, int x, int z)
Definition: Chara.cs:1266
void OnBanish()
Definition: Chara.cs:1240
bool CanEat(Thing t, bool shouldEat=false)
Definition: Chara.cs:6862
override int MaxHP
Definition: Chara.cs:693
Zone currentZone
Definition: Chara.cs:240
override bool IsDeadOrSleeping
Definition: Chara.cs:558
List< Hobby > ListHobbies(bool useMemberType=true)
Definition: Chara.cs:8136
SourceChara.Row source
Definition: Chara.cs:143
Stats mana
Definition: Chara.cs:963
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:955
List< Hobby > ListWorks(bool useMemberType=true)
Definition: Chara.cs:8109
void Revive(Point p=null, bool msg=false)
Definition: Chara.cs:4649
Zone homeZone
Definition: Chara.cs:252
Hobby GetWork(string id)
Definition: Chara.cs:8156
Religion faith
Definition: Chara.cs:424
void ClearBed(Map map=null)
Definition: Chara.cs:6614
FactionBranch homeBranch
Definition: Chara.cs:889
Thing MakeMilk(bool effect=true, int num=1, bool addToZone=true)
Definition: Chara.cs:7376
bool isDead
Definition: Chara.cs:374
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
Definition: Chara.cs:3920
Thing MakeEgg(bool effect=true, int num=1, bool addToZone=true)
Definition: Chara.cs:7396
SourceRace.Row race
Definition: Chara.cs:449
bool allPolicy
Definition: CoreDebug.cs:236
bool allHomeSkill
Definition: CoreDebug.cs:194
bool enable
Definition: CoreDebug.cs:285
static void MakeDish(Thing food, int lv, Chara crafter=null)
Definition: CraftUtil.cs:54
int GetRaw(int offsetHours=0)
Definition: Date.cs:322
int day
Definition: Date.cs:62
bool IsNight
Definition: Date.cs:112
Definition: EClass.cs:5
static Game game
Definition: EClass.cs:8
static Scene scene
Definition: EClass.cs:30
static Faction Home
Definition: EClass.cs:26
static int curve(int a, int start, int step, int rate=75)
Definition: EClass.cs:55
static int rnd(int a)
Definition: EClass.cs:50
static Core core
Definition: EClass.cs:6
static Zone _zone
Definition: EClass.cs:20
static World world
Definition: EClass.cs:40
static Map _map
Definition: EClass.cs:18
static SourceManager sources
Definition: EClass.cs:42
static int rndHalf(int a)
Definition: EClass.cs:74
static Player player
Definition: EClass.cs:12
static Chara pc
Definition: EClass.cs:14
static CoreDebug debug
Definition: EClass.cs:48
int Value(int ele)
Element ModBase(int ele, int v)
Element SetBase(string alias, int v, int potential=0)
int ValueWithoutLink
Definition: ELEMENT.cs:284
int id
Definition: ELEMENT.cs:240
SourceElement.Row source
Definition: ELEMENT.cs:263
bool HasTag(string tag)
Definition: ELEMENT.cs:463
virtual int CostLearn
Definition: ELEMENT.cs:304
int GetRoadDist(int gx, int gy)
Definition: EloMap.cs:438
void SetOwner(FactionBranch _branch)
MeetingManager meetings
string GetRandomName()
int GetProductBonus(Chara c)
void OnAfterSimulate()
string Log(string idLang, Card c1, Card c2, string ref1=null, string ref2=null)
void AddRecruit(Chara c)
ExpeditionManager expeditions
Thing GetMailBox()
void RefreshEfficiency()
void DailyOutcome(VirtualDate date)
Thing GetMeal(Chara c)
HappinessManager happiness
string Log(string idLang, Card c1, string ref1=null, string ref2=null, string ref3=null)
void RemoveRecruit(Chara c)
void OnSimulateMonth(VirtualDate date)
int CountNewRecruits()
int CountMembers(FactionMemberType type, bool onlyAlive=false)
void OnActivateZone()
void ChangeMemberType(Chara c, FactionMemberType type)
void AddFeat(int ele, int v)
void CalcInnIncome()
GStability stability
Point GetMailBoxPos()
int Evalue(int ele)
void OnCreate(Zone zone)
void ModExp(int a)
bool IsRecruit(Chara c)
void ClearNewRecruits()
bool TryTrash(Thing t)
Statistics lastStatistics
ResearchManager researches
Religion faith
string GetHearthHint(int a)
float GetHearthIncome()
Statistics statistics
void OnUnclaimZone()
int GetTechUpgradeCost(Element e)
void OnSimulateDay(VirtualDate date)
int GetNextExp(int _lv=-1)
float GetHearthIncome(string id)
void CalcTourismIncome()
List< Chara > members
void GenerateGarbage(VirtualDate date)
void RemoveMemeber(Chara c)
void SetOwner(Zone zone)
void UpdateReqruits(bool clear=false)
void OnSimulateHour(VirtualDate date)
void OnAdvanceDay()
List< HireInfo > listRecruit
int CountWealthyGuests()
string LogRaw(string text, string col=null)
void Recruit(Chara c)
void PutInMailBox(Thing t, bool outside=false, bool install=true)
PolicyManager policies
void OnUnloadMap()
void ReceivePackages(VirtualDate date)
string Log(string idLang, string ref1=null, string ref2=null, string ref3=null, string ref4=null)
bool HasItemProtection
HomeResourceManager resources
int GetHappiness(FactionMemberType type)
ElementContainerZone elements
void GetDailyIncome()
void BanishMember(Chara c, bool skipMsg=false)
void AddMemeber(Chara c)
void ValidateUpgradePolicies()
new Faction Wilds
FactionBranch FindBranch(Chara c)
Definition: FACTION.cs:419
ElementContainerFaction charaElements
Definition: FACTION.cs:144
bool IsGlobalPolicyActive(int id)
Definition: FACTION.cs:436
int CountTaxFreeLand()
Definition: FACTION.cs:544
ElementContainerZone elements
Definition: FACTION.cs:139
HashSet< int > globalPolicies
Definition: FACTION.cs:142
void RemoveReserve(Chara c)
Definition: FACTION.cs:351
void SetGlobalPolicyActive(int id, bool active)
Definition: FACTION.cs:449
bool isLoading
Definition: Game.cs:235
ReligionManager religions
Definition: Game.cs:158
CardManager cards
Definition: Game.cs:155
FactionManager factions
Definition: Game.cs:161
Zone StartZone
Definition: Game.cs:269
void SetOwner(FactionBranch _owner)
Chara chara
Definition: HireInfo.cs:6
int Hours
Definition: HireInfo.cs:26
Definition: Hobby.cs:4
SourceHobby.Row source
Definition: Hobby.cs:7
int GetEfficiency(Chara c)
Definition: Hobby.cs:30
int GetLv(Chara c)
Definition: Hobby.cs:21
void SetOwner(FactionBranch _owner)
HomeResourceWorth worth
Definition: Lang.cs:6
static string _currency(object a, string IDCurrency)
Definition: Lang.cs:162
Definition: Log.cs:4
void ForeachCell(Action< Cell > action)
Definition: MapBounds.cs:279
Point GetRandomSurface(int x, int z, int radius, bool walkable=true, bool allowWater=false)
Definition: MapBounds.cs:182
int Width
Definition: MapBounds.cs:26
Point GetCenterPos()
Definition: MapBounds.cs:52
int Height
Definition: MapBounds.cs:28
Point GetRandomPoint()
Definition: MapBounds.cs:97
Thing FindThing(Func< Thing, bool > func)
Definition: Map.cs:2570
PropsInstalled Installed
Definition: Map.cs:123
void SetDecal(int x, int z, int id=0, int amount=1, bool refresh=true)
Definition: Map.cs:2029
int CountHostile()
Definition: Map.cs:2445
List< Thing > things
Definition: Map.cs:49
int CountGuest()
Definition: Map.cs:2432
PropsManager props
Definition: Map.cs:91
int CountWildAnimal()
Definition: Map.cs:2458
PropsStocked Stocked
Definition: Map.cs:121
List< Chara > charas
Definition: Map.cs:81
MapBounds bounds
Definition: Map.cs:52
void OnSimulateHour(VirtualDate date)
void SetOwner(FactionBranch _branch)
Definition: MsgLog.cs:7
void Add(Data data)
Definition: MsgLog.cs:53
Definition: Msg.cs:5
static string GetRawText(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:37
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
static void SetColor()
Definition: Msg.cs:22
void AddMemeber(Chara c, bool showMsg=false)
Definition: Party.cs:51
bool elinGift
Definition: Player.cs:270
int days
Definition: Player.cs:68
Flags flags
Definition: Player.cs:895
Stats stats
Definition: Player.cs:817
string title
Definition: Player.cs:805
bool simulatingZone
Definition: Player.cs:980
Definition: Point.cs:9
bool HasDecal
Definition: Point.cs:139
int x
Definition: Point.cs:36
int z
Definition: Point.cs:39
Point Clamp(bool useBounds=false)
Definition: Point.cs:972
bool IsInBounds
Definition: Point.cs:104
Cell cell
Definition: Point.cs:51
Thing FindThing(Func< Thing, bool > func)
Definition: Point.cs:1104
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false)
Definition: Point.cs:595
Point GetRandomPoint(int radius, bool requireLos=true, bool allowChara=true, bool allowBlocked=false, int tries=100)
Definition: Point.cs:741
int GetValue(int id)
void Activate(int id)
void AddPolicy(string id)
bool HasPolicy(int id)
bool IsActive(int id, int days=-1)
void OnSimulateHour(VirtualDate date)
void SetOwner(FactionBranch _owner)
PropsInstalled installed
Definition: PropsManager.cs:8
List< Card > sales
Definition: PropsManager.cs:14
TraitManager traits
Definition: Props.cs:18
Thing Find(int uid)
Definition: Props.cs:357
int GetNum(string id, bool onlyShared=false)
Definition: Props.cs:395
ReligionEyth Eyth
ReligionLuck Luck
bool IsEyth
Definition: Religion.cs:44
SourceReligion.Row source
Definition: Religion.cs:32
virtual string id
Definition: Religion.cs:26
void SetOwner(FactionBranch _branch)
EloMap elomap
Definition: Scene.cs:143
LangGame langGame
SourceElement elements
virtual string Name
Definition: Spatial.cs:495
Faction mainFaction
Definition: Spatial.cs:430
int y
Definition: Spatial.cs:106
int x
Definition: Spatial.cs:94
static SpawnSetting HomeWild(int lv)
Definition: SpawnSetting.cs:91
static SpawnSetting HomeEnemy(int lv)
static SpawnSetting HomeGuest(int lv)
virtual int value
Definition: Stats.cs:56
virtual int max
Definition: Stats.cs:68
Definition: Steam.cs:8
static bool HasDLC(ID_DLC id)
Definition: Steam.cs:39
Thing Find(int uid)
bool IsFull(int y=0)
static Thing CreateTreasure(string id, int lv, TreasureType type=TreasureType.Map)
Definition: ThingGen.cs:203
static Thing CreateFromTag(string idTag, int lv=-1)
Definition: ThingGen.cs:80
static Thing CreateFromCategory(string idCat, int lv=-1)
Definition: ThingGen.cs:75
static Thing Create(string id, int idMat=-1, int lv=-1)
Definition: ThingGen.cs:53
Definition: Thing.cs:8
virtual bool IsCountAsResident
Definition: TraitChara.cs:67
static Chara Incubate(Thing egg, Point pos, Card incubator=null)
TraitSet GetTraitSet(Type t)
Definition: TraitManager.cs:94
virtual int CraftNum
Definition: Trait.cs:127
Point GetPoint()
Definition: Trait.cs:684
Card owner
Definition: Trait.cs:26
virtual bool CanStack
Definition: Trait.cs:145
static void Reserve(string idStep, Action onBeforePlay=null)
Definition: Tutorial.cs:55
BranchMap GetBranchMap()
Definition: VirtualDate.cs:44
bool IsRealTime
Definition: VirtualDate.cs:7
static void Say(string text, FontColor fontColor=FontColor.Default, Sprite sprite=null)
GameDate date
Definition: World.cs:6
void SendPackage(Thing p)
Definition: World.cs:68
Definition: Zone.cs:12
List< Chara > ListMinions(Chara c)
Definition: Zone.cs:3407
Thing TryGetThingFromSharedContainer(Func< Thing, bool > func)
Definition: Zone.cs:2159
ElementContainerZone elements
Definition: Zone.cs:43
Chara SpawnMob(Point pos=null, SpawnSetting setting=null)
Definition: Zone.cs:2543
MapBounds bounds
Definition: Zone.cs:46
bool TryAddThingInSharedContainer(Thing t, List< Thing > containers=null, bool add=true, bool msg=false, Chara chara=null, bool sharedOnly=true)
Definition: Zone.cs:2036
bool TryAddThing(Thing target, Point p, bool destroyIfFail=false)
Definition: Zone.cs:2133
bool IsActiveZone
Definition: Zone.cs:486
List< Element > ListLandFeats()
Definition: Zone.cs:2834
int GetSoilCost()
Definition: Zone.cs:3433
Card AddCard(Card t, Point point)
Definition: Zone.cs:1893
Map map
Definition: Zone.cs:60
Point GetSpawnPos(Chara c, ZoneTransition.EnterState destState=ZoneTransition.EnterState.Auto)
Definition: Zone.cs:1282
bool demo
Definition: Version.cs:14