Elin Decompiled Documentation EA 23.222 Stable nyan
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 }
344 else
345 {
346 c.hunger.Mod(-50);
347 }
348 }
349 }
350 }
351 });
352 expeditions.OnSimulateHour();
353 meetings.OnSimulateHour(date);
354 policies.OnSimulateHour(date);
355 int num2 = Evalue(3707);
356 int num3 = Evalue(3705) + Evalue(3710) * 2;
357 int num4 = 4 + num3 * 4;
358 int num5 = Mathf.Max(1, (100 + Evalue(2205) * 5 + Evalue(3703) * 100 - num2 * 80) / 10);
359 int num6 = 10;
360 if (policies.IsActive(2709))
361 {
362 num6 = 0;
363 }
365 {
366 num5 /= 2;
367 }
368 if ((date.IsRealTime || num2 > 0) && !EClass.debug.enable && EClass.rnd(num5) == 0 && !EClass.pc.IsDeadOrSleeping && EClass._map.CountHostile() < num4)
369 {
370 int num7 = 1 + EClass.rnd(num2 + num3 + 1);
371 for (int i = 0; i < num7; i++)
372 {
373 Chara chara = EClass._zone.SpawnMob(null, SpawnSetting.HomeEnemy(DangerLV));
374 if (chara.IsAnimal && policies.IsActive(2709))
375 {
376 chara.Destroy();
377 }
378 }
379 }
380 if ((date.IsRealTime || num2 == 0) && num6 != 0 && EClass.rnd(num6) == 0 && EClass._map.CountWildAnimal() < num4)
381 {
383 }
384 if (EClass.rnd(5) == 0 && policies.IsActive(2810))
385 {
386 int num8 = 3 + lv + Evalue(2206) / 5 + Evalue(3702) * 2 + Evalue(2202) / 2;
387 num8 = num8 * (100 + Evalue(3702) * 20 + Evalue(2206)) / 100;
388 num8 = num8 * (100 + (int)Mathf.Sqrt(Evalue(2811)) * 3) / 100;
389 if (luckyMonth)
390 {
391 num8 = num8 * 2 + 5;
392 }
393 if (EClass._map.CountGuest() < num8)
394 {
395 Chara chara2;
396 if (luckyMonth || (policies.IsActive(2822) && Mathf.Sqrt(Evalue(2822) / 2) + 5f >= (float)EClass.rnd(100)))
397 {
398 chara2 = CharaGen.CreateWealthy(ContentLV);
400 }
401 else
402 {
403 chara2 = EClass._zone.SpawnMob(null, SpawnSetting.HomeGuest(ContentLV));
404 }
405 if (chara2 != null && (chara2.id == "nun_mother" || chara2.id == "prostitute") && policies.IsActive(2710))
406 {
407 chara2.Destroy();
408 chara2 = null;
409 }
410 if (chara2 != null)
411 {
412 statistics.visitor++;
413 chara2.memberType = FactionMemberType.Guest;
414 chara2.SetInt(34, EClass.world.date.GetRaw());
415 chara2.c_allowance = chara2.LV * 100;
416 if (chara2.IsWealthy)
417 {
418 chara2.c_allowance *= 10;
419 }
420 if (date.IsRealTime)
421 {
422 Msg.Say("guestArrive", chara2.Name);
423 }
424 else
425 {
426 chara2.TryAssignBed();
427 }
428 }
429 }
430 }
431 foreach (Chara chara4 in EClass._map.charas)
432 {
433 if (chara4.memberType != FactionMemberType.Guest || ((chara4.c_allowance > 0 || EClass.rnd(2) != 0) && chara4.GetInt(34) + 10080 >= EClass.world.date.GetRaw()))
434 {
435 continue;
436 }
437 foreach (Chara item in EClass._zone.ListMinions(chara4))
438 {
439 item.Destroy();
440 }
441 if (!chara4.IsGlobal)
442 {
443 chara4.Destroy();
444 }
445 chara4.ClearBed();
446 break;
447 }
448 if (date.hour == 5)
449 {
450 for (int j = 0; j < ((!luckyMonth) ? 1 : 2); j++)
451 {
452 DailyOutcome(date);
453 }
454 GenerateGarbage(date);
455 if (!date.IsRealTime)
456 {
457 AutoClean();
458 }
459 CalcTourismIncome();
460 CalcInnIncome();
461 if (date.IsRealTime)
462 {
463 GetDailyIncome();
464 }
465 }
466 if (!EClass.player.simulatingZone && date.hour == 6)
467 {
468 ReceivePackages(date);
469 }
470 if (!date.IsRealTime && date.hour % 8 == 0)
471 {
472 foreach (Chara item2 in EClass._map.charas.Where((Chara c) => c.memberType == FactionMemberType.Guest).ToList())
473 {
474 for (int k = 0; k < 3; k++)
475 {
476 AI_Shopping.TryShop(item2, realtime: false);
477 }
478 }
479 AI_Shopping.TryRestock(EClass.pc, realtime: false);
480 }
481 if (EClass.rnd(24) == 0 || EClass.debug.enable)
482 {
483 foreach (Thing thing in EClass._map.things)
484 {
485 if (EClass.rnd(20) == 0 && thing.trait is TraitFoodEggFertilized && thing.pos.FindThing<TraitBed>() != null)
486 {
487 Chara chara3 = TraitFoodEggFertilized.Incubate(thing, thing.pos);
488 thing.ModNum(-1);
489 if (date.IsRealTime)
490 {
491 chara3.PlaySound("egg");
492 }
493 break;
494 }
495 }
496 }
497 resources.SetDirty();
498 }
499
500 public void AutoClean()
501 {
502 foreach (Chara member in members)
503 {
504 if (member.IsPCParty || !member.ExistsOnMap || member.memberType != 0)
505 {
506 continue;
507 }
508 Hobby hobby = member.GetWork("Clean") ?? member.GetWork("Chore");
509 if (hobby == null)
510 {
511 continue;
512 }
513 int num = (5 + EClass.rnd(5)) * hobby.GetEfficiency(member) / 100;
514 for (int i = 0; i < num; i++)
515 {
516 Thing thingToClean = AI_Haul.GetThingToClean(member);
517 if (thingToClean == null)
518 {
519 break;
520 }
522 }
523 }
524 }
525
526 public void OnSimulateDay(VirtualDate date)
527 {
528 if (owner == null || owner.mainFaction != EClass.Home)
529 {
530 return;
531 }
532 researches.OnSimulateDay();
533 resources.OnSimulateDay();
534 happiness.OnSimulateDay();
535 if (!date.IsRealTime)
536 {
537 BranchMap branchMap = date.GetBranchMap();
538 foreach (Chara member in members)
539 {
540 if (!member.IsPCParty && member.memberType != FactionMemberType.Livestock && !member.faith.IsEyth && !member.c_isPrayed && branchMap.altarMap.Contains(member.faith.id))
541 {
542 AI_Pray.Pray(member, silent: true);
543 }
544 }
545 }
546 foreach (Chara member2 in members)
547 {
548 member2.c_isPrayed = false;
549 member2.c_isTrained = false;
550 }
551 if (date.day != 1)
552 {
553 return;
554 }
555 luckyMonth = false;
556 if (date.month == 1)
557 {
558 luckyMonthDone = false;
559 }
560 if (!luckyMonthDone)
561 {
562 bool flag = EClass.pc.faith == EClass.game.religions.Luck;
563 luckyMonth = (float)(flag ? 30 : 5) + Mathf.Sqrt(Evalue(2118)) * (float)(flag ? 4 : 2) > (float)EClass.rnd(720);
564 if (EClass.debug.enable)
565 {
566 luckyMonth = true;
567 }
568 if (luckyMonth)
569 {
570 Log("lucky_month", EClass._zone.Name);
571 Msg.Say("lucky_month", EClass._zone.Name);
572 Msg.Say("umi");
573 SE.Play("godbless");
574 EClass.world.SendPackage(ThingGen.Create("book_kumiromi"));
575 luckyMonthDone = true;
576 }
577 }
578 }
579
580 public void OnAdvanceDay()
581 {
582 int num = 0;
583 foreach (Chara member in members)
584 {
585 if (member.IsPC || member.isDead)
586 {
587 continue;
588 }
589 if (member.IsPCParty || member.currentZone == EClass.pc.currentZone)
590 {
591 member.c_daysWithPC++;
592 }
593 if (member.memberType == FactionMemberType.Default)
594 {
595 if (EClass.rnd(3) == 0)
596 {
597 num++;
598 }
599 if (member.GetWork("Pioneer") != null)
600 {
601 num += 3;
602 }
603 }
604 }
605 ModExp(num);
606 }
607
608 public void OnSimulateMonth(VirtualDate date)
609 {
610 lastStatistics = statistics;
611 statistics = new Statistics();
612 }
613
614 public void GenerateGarbage(VirtualDate date)
615 {
616 int sortChance = 40 + GetCivility();
617 int unsortedCount = 0;
618 foreach (Chara member in members)
619 {
620 if (!member.IsPCParty && member.ExistsOnMap)
621 {
622 Hobby hobby = member.GetWork("Clean") ?? member.GetWork("Chore");
623 if (hobby != null)
624 {
625 sortChance += 20 * hobby.GetEfficiency(member) / 100;
626 }
627 }
628 }
629 int num = Evalue(2702);
630 int num2 = EClass.rnd(2);
631 for (int i = 0; i < num2; i++)
632 {
633 if (num == 0 || EClass.rnd(num + (EClass.debug.enable ? 100000 : 10)) == 0)
634 {
635 Generate(null);
636 }
637 }
638 foreach (Chara member2 in members)
639 {
640 if (!member2.IsPCParty && member2.ExistsOnMap && (num == 0 || EClass.rnd(num + (EClass.debug.enable ? 100000 : 10)) == 0))
641 {
642 Generate(member2);
643 }
644 }
645 void Generate(Chara c)
646 {
647 if (c == null || EClass.rnd(5) == 0)
648 {
649 if (EClass.rnd(80) == 0)
650 {
652 }
653 else if (EClass.rnd(40) == 0)
654 {
655 Thing thing;
656 Add(thing = ThingGen.CreateFromTag("garbage"));
657 }
658 else
659 {
660 string id = "trash2";
661 if (EClass.rnd(3) == 0)
662 {
663 id = "trash1";
664 }
665 if (EClass.rnd(10) == 0)
666 {
667 id = ((EClass.rnd(3) == 0) ? "529" : "1170");
668 }
669 if (c != null && (!c.IsUnique || c.memberType == FactionMemberType.Livestock) && EClass.rnd((c.memberType == FactionMemberType.Livestock) ? 2 : 50) == 0)
670 {
671 id = "_poop";
672 }
673 if (EClass.rnd(200000) == 0)
674 {
675 id = "goodness";
676 }
677 Add(ThingGen.Create(id));
678 }
679 }
680 void Add(Thing t)
681 {
682 if (sortChance < EClass.rnd(100))
683 {
684 EClass._zone.TryAddThing(t, (c != null) ? (c.pos.GetRandomPoint(2) ?? c.pos).GetNearestPoint() : EClass._zone.bounds.GetRandomSurface(), destroyIfFail: true);
685 }
686 else
687 {
688 if (t.id == "_poop" && EClass.rnd(150) == 0)
689 {
690 t.ChangeMaterial((EClass.rnd(2) == 0) ? "silver" : "gold");
691 }
692 if (!TryTrash(t))
693 {
694 unsortedCount++;
695 if (unsortedCount >= 5)
696 {
697 Tutorial.Reserve("garbage");
698 }
699 }
700 }
701 }
702 }
703 }
704
705 public bool TryTrash(Thing t)
706 {
707 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)));
708 if (thing != null)
709 {
710 thing.AddCard(t);
711 return true;
712 }
713 return EClass._zone.TryAddThingInSpot<TraitSpotGarbage>(t, useContainer: false);
714 }
715
716 public void ReceivePackages(VirtualDate date)
717 {
719 {
720 return;
721 }
722 List<Thing> listPackage = EClass.game.cards.listPackage;
723 if (EClass.player.stats.days >= 2 && !EClass.player.flags.elinGift && Steam.HasDLC(ID_DLC.BackerReward))
724 {
725 listPackage.Add(ThingGen.Create("gift"));
726 EClass.player.flags.elinGift = true;
727 }
728 if (listPackage.Count == 0)
729 {
730 return;
731 }
732 SE.Play("notice");
733 int num = 0;
734 foreach (Thing item in listPackage)
735 {
736 if (item.id != "bill")
737 {
738 num++;
739 }
740 PutInMailBox(item, item.id == "cardboard_box" || item.id == "gift");
741 WidgetPopText.Say("popDeliver".lang(item.Name));
742 }
743 Msg.Say("deliver_arrive", num.ToString() ?? "");
744 listPackage.Clear();
745 }
746
747 public void DailyOutcome(VirtualDate date)
748 {
749 Thing thing = null;
750 foreach (Chara member in members)
751 {
752 Chara i = member;
753 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())
754 {
755 Thing thing2 = ThingGen.Create("panty");
756 thing2.c_idRefCard = i.id;
757 i.AddThing(thing2);
758 }
759 if (i.IsPCParty || !i.ExistsOnMap)
760 {
761 continue;
762 }
763 i.RefreshWorkElements(elements);
764 if (i.memberType == FactionMemberType.Livestock)
765 {
766 if (thing == null)
767 {
768 thing = EClass._map.Stocked.Find("pasture", -1, -1, shared: true) ?? EClass._map.Installed.Find("pasture");
769 }
770 if (thing == null)
771 {
772 continue;
773 }
774 if (i.race.breeder >= EClass.rnd(2500 - (int)Mathf.Sqrt(Evalue(2827) * 100)))
775 {
776 if (EClass.rnd(3) != 0)
777 {
778 Thing t2 = i.MakeEgg(date.IsRealTime, 1, date.IsRealTime);
779 if (!date.IsRealTime)
780 {
781 i.TryPutShared(t2);
782 }
783 }
784 else
785 {
786 Thing t3 = i.MakeMilk(date.IsRealTime, 1, date.IsRealTime);
787 if (!date.IsRealTime)
788 {
789 i.TryPutShared(t3);
790 }
791 }
792 }
793 if (i.HaveFur())
794 {
795 if (i.HasElement(1533))
796 {
797 i.c_fur = 0;
798 }
799 else
800 {
801 i.c_fur++;
802 if (EClass.rnd(4) == 0 && i.HasElement(1532))
803 {
804 i.c_fur++;
805 }
806 }
807 }
808 thing.ModNum(-1);
809 if (thing.isDestroyed || thing.Num == 0)
810 {
811 thing = null;
812 }
813 continue;
814 }
815 foreach (Hobby item in i.ListHobbies())
816 {
817 GetOutcome(item);
818 }
819 foreach (Hobby item2 in i.ListWorks())
820 {
821 GetOutcome(item2);
822 }
823 void GetOutcome(Hobby h)
824 {
825 int num3 = h.GetEfficiency(i) * GetProductBonus(i) / 100;
826 int num4 = h.GetLv(i);
827 int id = EClass.sources.elements.alias[h.source.skill].id;
828 if (!i.elements.HasBase(id))
829 {
830 i.elements.SetBase(id, 1);
831 }
832 i.ModExp(id, 100);
833 for (int j = 0; j < h.source.things.Length; j += 2)
834 {
835 string text = h.source.things[j];
836 int num5 = Mathf.Max(1, h.source.things[j + 1].ToInt() * num3 / 1000);
837 int num6 = num5 / 1000;
838 if (num5 % 1000 > EClass.rnd(1000))
839 {
840 num6++;
841 }
842 if (num6 != 0)
843 {
844 if (!(text == "_egg"))
845 {
846 if (text == "milk")
847 {
848 i.MakeMilk(date.IsRealTime, num6);
849 }
850 else
851 {
852 Thing thing4 = ((!text.StartsWith("#")) ? ThingGen.Create(h.source.things[j], -1, num4) : ThingGen.CreateFromCategory(text.Replace("#", ""), num4));
853 if (thing4 != null)
854 {
855 num6 *= thing4.trait.CraftNum;
856 if (thing4.category.id == "fish" && EClass.rnd(EClass.debug.enable ? 1 : 5) == 0)
857 {
858 int num7 = Mathf.Min(EClass.rnd(EClass.rnd(EClass.rnd(EClass.curve(num4, 100, 50, 70) + 50))) / 50, 3);
859 if (num7 > 0)
860 {
861 thing4.SetTier(num7);
862 num6 /= num7 + 1;
863 }
864 }
865 if (num6 < 1)
866 {
867 num6 = 1;
868 }
869 if (!thing4.trait.CanStack)
870 {
871 num6 = 1;
872 }
873 thing4.SetNum(num6);
874 thing4.SetBlessedState(BlessedState.Normal);
875 thing4.TryMakeRandomItem(num4);
876 if (thing4.IsAmmo)
877 {
878 thing4.ChangeMaterial("iron");
879 thing4.c_IDTState = 0;
880 }
881 bool flag = thing4.category.id == "garbage";
882 if (thing4.trait is TraitFoodMeal)
883 {
884 if (thing4.HasTag(CTAG.dish_fail))
885 {
886 flag = true;
887 }
888 else
889 {
890 CraftUtil.MakeDish(thing4, num4 + 10, i);
891 if (thing4.id == "lunch_dystopia")
892 {
893 flag = true;
894 }
895 }
896 }
897 if (flag)
898 {
899 TryTrash(thing4);
900 }
901 else
902 {
903 i.TryPutShared(thing4);
904 }
905 }
906 }
907 }
908 else
909 {
910 i.MakeEgg(date.IsRealTime, num6);
911 }
912 }
913 }
914 switch (h.source.alias)
915 {
916 case "Nurse":
917 {
918 foreach (Chara member2 in members)
919 {
920 if (!member2.IsPCParty)
921 {
922 if (member2.isDead && member2.CanRevive() && EClass.rnd(num3) > EClass.rnd(100))
923 {
924 Log("bNurse", i, member2);
925 member2.Revive(member2.pos, msg: true);
926 if (date.IsRealTime && member2.c_wasInPcParty)
927 {
928 EClass.pc.party.AddMemeber(member2, showMsg: true);
929 }
930 break;
931 }
932 if (EClass.rnd(num3) > EClass.rnd(100))
933 {
934 member2.CureHost(CureType.HealComplete);
935 }
936 }
937 }
938 break;
939 }
940 case "Chore":
941 case "Clean":
942 {
943 for (int k = 0; k < num3 / 2; k++)
944 {
945 Point randomPoint = EClass._map.bounds.GetRandomPoint();
946 if (randomPoint.HasDecal)
947 {
948 EClass._map.SetDecal(randomPoint.x, randomPoint.z);
949 }
950 }
951 break;
952 }
953 case "TreasureHunt":
954 if (EClass.rnd(num3) > EClass.rnd(EClass.debug.enable ? 100 : 5000))
955 {
957 if (thing5 != null)
958 {
959 Thing thing6 = ThingGen.CreateTreasure("chest_treasure", thing5.LV);
960 i.TryPutShared(thing6);
961 thing5.Destroy();
962 WidgetPopText.Say("foundTreasure".lang(thing6.Name));
963 }
964 }
965 break;
966 }
967 }
968 }
969 int soilCost = EClass._zone.GetSoilCost();
970 int num = Mathf.Min(100, 70 + (MaxSoil - soilCost));
971 int flower = 5;
972 int lv = 1;
973 EClass._map.bounds.ForeachCell(delegate(Cell cell)
974 {
975 if (cell.obj != 0 && cell.sourceObj.tag.Contains("flower"))
976 {
977 PlantData plantData = cell.TryGetPlant();
978 if (plantData != null && plantData.seed != null)
979 {
980 lv += plantData.seed.encLV + 1;
981 }
982 else
983 {
984 lv++;
985 }
986 flower++;
987 }
988 });
989 lv /= flower;
990 int num2 = 0;
991 foreach (Thing thing7 in EClass._map.things)
992 {
993 if (thing7.IsInstalled && thing7.trait is TraitBeekeep && !thing7.things.IsFull())
994 {
995 flower -= 3 + EClass.rnd(5 + num2 * 4);
996 num2++;
997 if (flower < 0)
998 {
999 break;
1000 }
1001 if (EClass.rnd(100) <= num)
1002 {
1003 Thing thing3 = ThingGen.Create("honey");
1004 thing3.SetEncLv(lv / 10);
1005 thing3.elements.SetBase(2, EClass.curve(lv, 50, 10, 80));
1006 thing7.AddThing(thing3);
1007 }
1008 }
1009 }
1010 }
1011
1012 public void PutInMailBox(Thing t, bool outside = false, bool install = true)
1013 {
1014 if (!outside)
1015 {
1016 Thing mailBox = GetMailBox();
1017 if (mailBox != null)
1018 {
1019 mailBox.AddCard(t);
1020 return;
1021 }
1022 }
1023 Point mailBoxPos = GetMailBoxPos();
1024 EClass._zone.AddCard(t, mailBoxPos);
1025 if (install)
1026 {
1027 t.Install();
1028 }
1029 }
1030
1032 {
1033 return EClass._map.props.installed.FindEmptyContainer<TraitMailPost>();
1034 }
1035
1037 {
1038 Thing thing = GetMailBox();
1039 if (thing == null)
1040 {
1042 }
1043 if (thing != null)
1044 {
1045 return thing.pos.GetNearestPoint(allowBlock: false, allowChara: true, allowInstalled: false, ignoreCenter: true).Clamp(useBounds: true);
1046 }
1047 return EClass._map.GetCenterPos();
1048 }
1049
1050 public int GetResidentTax()
1051 {
1052 if (!policies.IsActive(2512, 30))
1053 {
1054 return 0;
1055 }
1056 int num = 0;
1057 int num2 = (policies.IsActive(2500, 30) ? Evalue(2500) : 0);
1058 int num3 = (policies.IsActive(2501, 30) ? Evalue(2501) : 0);
1059 int num4 = 50 + (int)Mathf.Sqrt(Evalue(2512)) * 5;
1060 foreach (Chara member in members)
1061 {
1062 if (member.IsPC || member.memberType != 0)
1063 {
1064 continue;
1065 }
1066 bool isWealthy = member.IsWealthy;
1067 int num5 = 0;
1068 foreach (Hobby item in member.ListWorks().Concat(member.ListHobbies()))
1069 {
1070 int num6 = item.source.tax * 100 / 100;
1071 if (num6 > num5)
1072 {
1073 num5 = num6;
1074 }
1075 }
1076 int num7 = ((isWealthy ? 50 : 10) + member.LV * 2) * num5 / 100 * num4 / 100;
1077 if (isWealthy && num2 > 0)
1078 {
1079 num7 = num7 * (150 + (int)Mathf.Sqrt(num2) * 5) / 100;
1080 }
1081 if (num3 > 0)
1082 {
1083 num7 += (80 + (int)Mathf.Sqrt(num3) * 5) * member.faith.source.tax / 100;
1084 }
1085 num7 = num7 * efficiency / (IsTaxFree ? 100 : 1000);
1086 num += num7;
1087 if (num7 > 0)
1088 {
1089 Log("bTax", num7.ToString() ?? "", member.Name);
1090 }
1091 }
1092 statistics.tax += num;
1093 return num;
1094 }
1095
1096 public void CalcInnIncome()
1097 {
1098 int num = CountGuests();
1099 if (num == 0)
1100 {
1101 return;
1102 }
1103 int num2 = 0;
1104 int num3 = 0;
1105 foreach (Thing thing in EClass._map.things)
1106 {
1107 if (thing.IsInstalled && thing.trait is TraitBed traitBed && traitBed.owner.c_bedType == BedType.guest)
1108 {
1109 int maxHolders = traitBed.MaxHolders;
1110 num2 += maxHolders;
1111 num3 += traitBed.owner.LV * (100 + traitBed.owner.Quality / 2 + traitBed.owner.Evalue(750) / 2) / 100 * maxHolders;
1112 }
1113 }
1114 num = Mathf.Min(num, num2);
1115 if (num != 0)
1116 {
1117 num3 /= num2;
1118 num3 = num3 * (100 + 5 * (int)Mathf.Sqrt(Evalue(2812))) / 100;
1119 float num4 = 10f + Mathf.Sqrt(num) * 10f;
1120 if (policies.IsActive(2813))
1121 {
1122 num4 += Mathf.Sqrt(CountWealthyGuests()) * 50f * (80f + 5f * Mathf.Sqrt(Evalue(2813))) / 100f;
1123 }
1124 if (policies.IsActive(2812))
1125 {
1126 num4 = num4 * (float)(100 + num3) / 100f;
1127 }
1128 num4 = Mathf.Min(num4, Mathf.Sqrt(Worth) / 15f + 5f);
1129 incomeInn += EClass.rndHalf((int)num4) + EClass.rndHalf((int)num4);
1130 }
1131 }
1132
1133 public void CalcTourismIncome()
1134 {
1135 int num = CountGuests();
1136 if (num != 0)
1137 {
1138 float num2 = 10f + Mathf.Sqrt(num) * 10f;
1139 if (policies.IsActive(2815))
1140 {
1141 num2 += Mathf.Sqrt(CountWealthyGuests()) * 50f * (80f + 5f * Mathf.Sqrt(Evalue(2815))) / 100f;
1142 }
1143 num2 = Mathf.Min(num2, Mathf.Sqrt(tourism) / 5f);
1144 incomeTourism += EClass.rndHalf((int)num2) + EClass.rndHalf((int)num2);
1145 }
1146 }
1147
1148 public void GetDailyIncome()
1149 {
1150 GetIncome(ref incomeShop, ref statistics.shop, "getIncomeShop", tax: false);
1151 GetIncome(ref incomeInn, ref statistics.inn, "getIncomeInn", tax: true);
1152 GetIncome(ref incomeTourism, ref statistics.tourism, "getIncomeTourism", tax: true);
1153 void GetIncome(ref int n, ref int stat, string lang, bool tax)
1154 {
1155 if (tax && !IsTaxFree)
1156 {
1157 n = n * 10 / 100;
1158 }
1159 if (n != 0)
1160 {
1161 Msg.Say(lang, Lang._currency(n, "money"), owner.Name);
1162 Thing t = ThingGen.Create("money").SetNum(n);
1163 EClass.pc.Pick(t);
1164 stat += n;
1165 n = 0;
1166 }
1167 }
1168 }
1169
1171 {
1172 if (c.things.IsFull())
1173 {
1174 return null;
1175 }
1176 Thing thing = EClass._zone.TryGetThingFromSharedContainer((Thing t) => c.CanEat(t, shouldEat: true) && !t.c_isImportant);
1177 if (thing != null)
1178 {
1179 thing = thing.Split(1);
1180 }
1181 return thing;
1182 }
1183
1184 public void OnClaimZone()
1185 {
1187 {
1188 foreach (SourceElement.Row item in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "tech"))
1189 {
1190 elements.SetBase(item.id, 1);
1191 }
1192 foreach (SourceElement.Row item2 in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "policy" && !a.tag.Contains("hidden")))
1193 {
1194 policies.AddPolicy(item2.id);
1195 }
1196 }
1197 else
1198 {
1199 elements.SetBase(2003, 1);
1200 elements.SetBase(4002, 1);
1201 elements.SetBase(2115, 1);
1202 elements.SetBase(2204, 1);
1203 elements.SetBase(2120, 1);
1204 policies.AddPolicy(2512);
1205 policies.AddPolicy(2702);
1206 policies.AddPolicy(2703);
1207 policies.AddPolicy(2516);
1208 policies.AddPolicy(2515);
1209 policies.AddPolicy(2514);
1210 }
1212 {
1213 policies.Activate(2514);
1214 }
1215 Element element = EClass._zone.ListLandFeats()[0];
1216 elements.SetBase(element.id, 1);
1217 switch (element.id)
1218 {
1219 case 3604:
1220 elements.SetBase(2206, 10);
1221 break;
1222 case 3602:
1223 elements.SetBase(2206, 15);
1224 break;
1225 }
1226 if (EClass.game.StartZone == owner || owner is Zone_Vernis)
1227 {
1228 AddMemeber(EClass.pc);
1229 }
1231 {
1232 foreach (SourceElement.Row item3 in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "policy"))
1233 {
1234 policies.AddPolicy(item3.id);
1235 }
1236 }
1237 ValidateUpgradePolicies();
1238 }
1239
1240 public void OnUnclaimZone()
1241 {
1242 List<Element> source = owner.ListLandFeats();
1243 if (lv >= 5)
1244 {
1245 foreach (Element item in source.Where((Element a) => a.HasTag("network")).ToList())
1246 {
1248 }
1249 }
1250 Element[] array = elements.dict.Values.ToArray();
1251 foreach (Element element in array)
1252 {
1253 elements.SetBase(element.id, 0);
1254 }
1255 owner.landFeats = null;
1256 owner.ListLandFeats();
1257 owner.branch = null;
1258 }
1259
1261 {
1262 if (lv >= 2)
1263 {
1264 if (!policies.HasPolicy(2705))
1265 {
1266 policies.AddPolicy(2705);
1268 }
1269 if (!policies.HasPolicy(2708))
1270 {
1271 policies.AddPolicy(2708);
1273 }
1274 if (!policies.HasPolicy(2707))
1275 {
1276 policies.AddPolicy(2707);
1277 }
1278 if (!policies.HasPolicy(2709))
1279 {
1280 policies.AddPolicy(2709);
1281 }
1282 if (!policies.HasPolicy(2715))
1283 {
1284 policies.AddPolicy(2715);
1285 }
1286 }
1287 foreach (int globalPolicy in EClass.pc.faction.globalPolicies)
1288 {
1289 if (!policies.HasPolicy(globalPolicy))
1290 {
1291 policies.AddPolicy(globalPolicy, show: false);
1293 }
1294 }
1295 }
1296
1297 public void Upgrade()
1298 {
1299 List<Element> list = owner.ListLandFeats();
1300 if (owner.IsActiveZone)
1301 {
1302 TraitCoreZone traitCoreZone = EClass._map.FindThing<TraitCoreZone>();
1303 if (traitCoreZone != null)
1304 {
1305 SE.Play("godbless");
1306 traitCoreZone.owner.PlayEffect("aura_heaven");
1307 }
1308 }
1309 lv++;
1310 exp = 0;
1311 int admin = 4;
1312 int food = 4;
1313 Set(4, 3);
1314 switch (list[0].id)
1315 {
1316 case 3500:
1317 Set(5, 3);
1318 break;
1319 case 3604:
1320 Set(4, 3);
1321 break;
1322 case 3600:
1323 Set(5, 3);
1324 break;
1325 case 3601:
1326 Set(4, 4);
1327 break;
1328 case 3603:
1329 Set(6, 2);
1330 break;
1331 case 3602:
1332 Set(5, 2);
1333 break;
1334 }
1335 elements.SetBase(2003, Mathf.Min((lv - 1) * 2 + 1, 10));
1336 elements.SetBase(2115, (lv - 1) * admin + 1);
1337 elements.SetBase(2204, (lv - 1) * food + 1);
1338 elements.GetElement(2003).CheckLevelBonus(elements);
1339 ValidateUpgradePolicies();
1340 if (lv == 4)
1341 {
1342 elements.SetBase(list[1].id, 1);
1343 }
1344 if (lv == 7)
1345 {
1346 elements.SetBase(list[2].id, 1);
1347 }
1348 if (lv >= 5)
1349 {
1350 List<Element> list2 = elements.dict.Values.Where((Element a) => a.source.category == "landfeat" && a.HasTag("network")).ToList();
1351 foreach (Element item in list2)
1352 {
1354 }
1355 foreach (Element item2 in list2)
1356 {
1357 elements.Remove(item2.id);
1358 }
1359 }
1360 Msg.Say("upgrade_hearth", lv.ToString() ?? "", owner.Name);
1361 LogRaw("upgrade_hearth".langGame(lv.ToString() ?? "", owner.Name), "Good");
1362 Tutorial.Reserve("stone");
1363 void Set(int a, int f)
1364 {
1365 admin = a;
1366 food = f;
1367 }
1368 }
1369
1370 public bool CanUpgrade()
1371 {
1372 if (lv < MaxLv)
1373 {
1374 if (exp < GetNextExp())
1375 {
1376 return EClass.debug.enable;
1377 }
1378 return true;
1379 }
1380 return false;
1381 }
1382
1383 public int GetUpgradeCost()
1384 {
1385 return lv * lv * lv * 1000;
1386 }
1387
1388 public void ModExp(int a)
1389 {
1390 if (policies.IsActive(2515))
1391 {
1392 return;
1393 }
1394 if (policies.IsActive(2516))
1395 {
1396 a = a * 150 / 100 + EClass.rnd(2);
1397 }
1398 exp += a;
1399 if (exp >= GetNextExp() && CanUpgrade())
1400 {
1401 if (EClass.core.version.demo && lv >= 3)
1402 {
1403 exp = 0;
1404 Msg.Say("demoLimit2");
1405 }
1406 else
1407 {
1408 Upgrade();
1409 }
1410 }
1411 }
1412
1413 public string GetHearthHint(int a)
1414 {
1415 if (a <= 1)
1416 {
1417 return "hearth1".lang();
1418 }
1419 string text = "";
1420 for (int i = 1; i < a; i++)
1421 {
1422 string text2 = ("hearth" + (i + 1)).lang();
1423 if (!text2.IsEmpty())
1424 {
1425 text = text + text2 + Environment.NewLine;
1426 }
1427 }
1428 return text.TrimEnd(Environment.NewLine.ToCharArray());
1429 }
1430
1431 public void AddFeat(int ele, int v)
1432 {
1433 elements.ModBase(ele, v);
1434 WidgetPopText.Say("rewardElement".lang(EClass.sources.elements.map[ele].GetName()));
1435 }
1436
1437 public void AddMemeber(Chara c)
1438 {
1439 if (members.Contains(c))
1440 {
1441 return;
1442 }
1445 c.SetGlobal();
1447 c.SetHomeZone(owner);
1448 foreach (Thing item in c.things.List((Thing a) => a.HasTag(CTAG.godArtifact)).Copy())
1449 {
1451 }
1452 if (c.OriginalHostility <= Hostility.Ally)
1453 {
1454 c.c_originalHostility = Hostility.Ally;
1455 }
1456 c.hostility = Hostility.Ally;
1457 c.enemy = null;
1458 c.orgPos = null;
1459 if (c.memberType != 0 && c.memberType != FactionMemberType.Livestock)
1460 {
1461 c.memberType = FactionMemberType.Default;
1462 }
1463 if (c.hp > c.MaxHP)
1464 {
1465 c.hp = c.MaxHP;
1466 }
1467 if (c.mana.value > c.mana.max)
1468 {
1469 c.mana.value = c.mana.max;
1470 }
1471 if (c.stamina.value > c.stamina.max)
1472 {
1473 c.stamina.value = c.stamina.max;
1474 }
1475 members.Add(c);
1477 RefreshEfficiency();
1478 c.RefreshWorkElements(elements);
1479 if (uidMaid == 0 && c.id == "maid")
1480 {
1481 uidMaid = c.uid;
1482 }
1483 }
1484
1486 {
1487 c.ClearBed();
1488 c.memberType = type;
1489 c.c_wasInPcParty = false;
1490 RefreshEfficiency();
1491 c.RefreshWorkElements(elements);
1492 policies.Validate();
1493 }
1494
1495 public void BanishMember(Chara c, bool skipMsg = false)
1496 {
1497 RemoveMemeber(c);
1498 if (!skipMsg)
1499 {
1500 Msg.Say("banish", c, EClass._zone.Name);
1501 }
1503 {
1504 c.RemoveGlobal();
1505 }
1506 if (c.IsGlobal)
1507 {
1508 c.OnBanish();
1509 }
1510 else
1511 {
1512 c.Destroy();
1513 }
1514 }
1515
1516 public void RemoveMemeber(Chara c)
1517 {
1518 c.isSale = false;
1519 if (c.currentZone != null && c.currentZone.map != null)
1520 {
1522 c.currentZone.map.props.sales.Remove(c);
1523 }
1525 if (!(c.trait is TraitUniqueChara) && !c.IsUnique && !EClass.game.cards.listAdv.Contains(c))
1526 {
1527 c.RemoveGlobal();
1528 }
1529 members.Remove(c);
1532 policies.Validate();
1533 RefreshEfficiency();
1534 }
1535
1537 {
1538 float num = 0f;
1539 if (members.Count == 0)
1540 {
1541 return 0;
1542 }
1543 foreach (Chara member in members)
1544 {
1545 num += (float)member.happiness;
1546 }
1547 return (int)(num / (float)members.Count);
1548 }
1549
1550 public bool IsAllDead()
1551 {
1552 foreach (Chara member in members)
1553 {
1554 if (!member.isDead)
1555 {
1556 return false;
1557 }
1558 }
1559 return true;
1560 }
1561
1562 public void Recruit(Chara c)
1563 {
1564 RemoveRecruit(c);
1565 AddMemeber(c);
1566 c.isRestrained = false;
1567 if (c.currentZone != EClass._zone && !c.isDead)
1568 {
1570 EClass._zone.AddCard(c, point);
1571 }
1572 RefreshEfficiency();
1574 Msg.Say("hire".langGame(c.Name));
1575 }
1576
1578 {
1579 foreach (Chara member in members)
1580 {
1581 if (member.IsAliveInCurrentZone && member.IsMaid)
1582 {
1583 return member;
1584 }
1585 }
1586 return null;
1587 }
1588
1589 public string GetRandomName()
1590 {
1591 if (EClass.rnd(4) == 0 || members.Count == 0)
1592 {
1593 return EClass.player.title;
1594 }
1595 return members.RandomItem().Name;
1596 }
1597
1598 public int CountMembers(FactionMemberType type, bool onlyAlive = false)
1599 {
1600 int num = 0;
1601 foreach (Chara member in members)
1602 {
1603 if (member.memberType == type && (!onlyAlive || !member.isDead) && (type != 0 || member.trait.IsCountAsResident))
1604 {
1605 num++;
1606 }
1607 }
1608 return num;
1609 }
1610
1611 public int CountGuests()
1612 {
1613 int num = 0;
1614 foreach (Chara chara in EClass._map.charas)
1615 {
1616 if (chara.memberType == FactionMemberType.Guest)
1617 {
1618 num++;
1619 }
1620 }
1621 return num;
1622 }
1623
1625 {
1626 int num = 0;
1627 foreach (Chara chara in EClass._map.charas)
1628 {
1629 if (chara.memberType == FactionMemberType.Guest && chara.IsWealthy)
1630 {
1631 num++;
1632 }
1633 }
1634 return num;
1635 }
1636
1637 public void UpdateReqruits(bool clear = false)
1638 {
1639 resources.Refresh();
1640 if (clear)
1641 {
1642 listRecruit.ForeachReverse(delegate(HireInfo i)
1643 {
1644 if (!i.chara.IsGlobal)
1645 {
1646 i.chara.Destroy();
1647 }
1648 if (i.chara.isDestroyed)
1649 {
1650 listRecruit.Remove(i);
1651 }
1652 });
1653 listRecruit.Clear();
1654 lastUpdateReqruit = -1;
1655 }
1656 else
1657 {
1658 listRecruit.ForeachReverse(delegate(HireInfo i)
1659 {
1660 if (i.Hours < 0)
1661 {
1662 if (!i.chara.IsGlobal)
1663 {
1664 i.chara.Destroy();
1665 }
1666 listRecruit.Remove(i);
1667 }
1668 });
1669 }
1670 if (lastUpdateReqruit == EClass.world.date.day)
1671 {
1672 return;
1673 }
1674 lastUpdateReqruit = EClass.world.date.day;
1675 int num = 2 + (int)Mathf.Sqrt(Evalue(2513)) / 2;
1676 int num2 = EClass.rnd(3 + (int)Mathf.Sqrt(Evalue(2513)) / 2) + num - listRecruit.Count;
1677 if (num2 <= 0)
1678 {
1679 return;
1680 }
1681 new List<Chara>(EClass.game.cards.globalCharas.Values).Shuffle();
1682 for (int j = 0; j < num2; j++)
1683 {
1684 Chara chara = CharaGen.CreateFromFilter("c_neutral", ContentLV + Mathf.Min(EClass.player.stats.days, 10));
1685 if (chara.isBackerContent || chara.source.quality != 0)
1686 {
1687 j--;
1688 }
1689 else
1690 {
1691 AddRecruit(chara);
1692 }
1693 }
1695 {
1697 }
1698 }
1699
1700 public void AddRecruit(Chara c)
1701 {
1702 HireInfo hireInfo = new HireInfo
1703 {
1704 chara = c,
1705 isNew = true
1706 };
1707 hireInfo.deadline = EClass.world.date.GetRaw() + (EClass.rnd(5) + 1) * 1440 + EClass.rnd(24) * 60;
1708 listRecruit.Add(hireInfo);
1709 }
1710
1711 public void RemoveRecruit(Chara c)
1712 {
1713 listRecruit.ForeachReverse(delegate(HireInfo i)
1714 {
1715 if (i.chara == c)
1716 {
1717 listRecruit.Remove(i);
1718 }
1719 });
1720 }
1721
1722 public int CountNewRecruits()
1723 {
1724 int num = 0;
1725 foreach (HireInfo item in listRecruit)
1726 {
1727 if (item.isNew)
1728 {
1729 num++;
1730 }
1731 }
1732 return num;
1733 }
1734
1735 public void ClearNewRecruits()
1736 {
1737 foreach (HireInfo item in listRecruit)
1738 {
1739 item.isNew = false;
1740 }
1741 }
1742
1743 public bool IsRecruit(Chara c)
1744 {
1745 foreach (HireInfo item in listRecruit)
1746 {
1747 if (item.chara == c)
1748 {
1749 return true;
1750 }
1751 }
1752 return false;
1753 }
1754
1755 public int CountPasture()
1756 {
1757 return EClass._map.Stocked.GetNum("pasture", onlyShared: true) + EClass._map.Installed.GetNum("pasture");
1758 }
1759
1760 public int GetPastureCost()
1761 {
1762 return CountMembers(FactionMemberType.Livestock);
1763 }
1764
1765 public int GetCivility()
1766 {
1767 int num = 10 + Evalue(2203);
1768 if (Evalue(2701) > 0)
1769 {
1770 num += 10 + (int)Mathf.Sqrt(Evalue(2701));
1771 }
1772 if (Evalue(2702) > 0)
1773 {
1774 num -= 10 + (int)Mathf.Sqrt(Evalue(2702));
1775 }
1776 return num;
1777 }
1778
1779 public float GetHearthIncome()
1780 {
1781 float num = 0f;
1782 foreach (Element value in elements.dict.Values)
1783 {
1784 if (value.source.category == "culture")
1785 {
1786 num += GetHearthIncome(value.source.alias);
1787 }
1788 }
1789 return num;
1790 }
1791
1792 public float GetHearthIncome(string id)
1793 {
1794 int num = 0;
1795 foreach (KeyValuePair<int, Element> item in elements.dict)
1796 {
1797 if (item.Value.source.aliasParent == id)
1798 {
1799 num++;
1800 }
1801 }
1802 return 0.2f * (float)num;
1803 }
1804
1806 {
1807 int valueWithoutLink = e.ValueWithoutLink;
1808 valueWithoutLink += e.CostLearn;
1809 if (e.source.max != 0 && e.ValueWithoutLink >= e.source.max)
1810 {
1811 return 0;
1812 }
1813 return valueWithoutLink;
1814 }
1815
1816 public string Log(string idLang, string ref1 = null, string ref2 = null, string ref3 = null, string ref4 = null)
1817 {
1818 Msg.alwaysVisible = true;
1819 return LogRaw(Msg.GetRawText(idLang, ref1, ref2, ref3, ref4), EClass.sources.langGame.map[idLang].logColor);
1820 }
1821
1822 public string Log(string idLang, Card c1, Card c2, string ref1 = null, string ref2 = null)
1823 {
1824 Msg.alwaysVisible = true;
1825 return LogRaw(Msg.GetRawText(idLang, c1, c2, ref1, ref2), EClass.sources.langGame.map[idLang].logColor);
1826 }
1827
1828 public string Log(string idLang, Card c1, string ref1 = null, string ref2 = null, string ref3 = null)
1829 {
1830 Msg.alwaysVisible = true;
1831 return LogRaw(Msg.GetRawText(idLang, c1, ref1, ref2, ref3), EClass.sources.langGame.map[idLang].logColor);
1832 }
1833
1834 public string LogRaw(string text, string col = null)
1835 {
1836 log.Add(text, col.IsEmpty() ? null : col);
1837 Msg.alwaysVisible = false;
1838 Msg.SetColor();
1839 return text;
1840 }
1841}
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
List< Chara > listAdv
Definition: CardManager.cs:64
GlobalCharaList globalCharas
Definition: CardManager.cs:46
List< Thing > listPackage
Definition: CardManager.cs:61
Definition: Card.cs:11
void SetTier(int a, bool setTraits=true)
Definition: Card.cs:3799
bool isDestroyed
Definition: Card.cs:75
Thing TryMakeRandomItem(int lv=-1, TryMakeRandomItemSource itemSource=TryMakeRandomItemSource.Default, Chara crafter=null)
Definition: Card.cs:5341
void PurgeDuplicateArtifact(Thing af)
Definition: Card.cs:3203
bool IsAmmo
Definition: Card.cs:2235
Thing Split(int a)
Definition: Card.cs:3414
ElementContainerCard elements
Definition: Card.cs:41
bool c_wasInPcParty
Definition: Card.cs:1012
string id
Definition: Card.cs:35
bool IsUnique
Definition: Card.cs:2079
bool HasElement(int ele, int req=1)
Definition: Card.cs:5787
bool isRestrained
Definition: Card.cs:566
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6009
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:3022
Card AddCard(Card c)
Definition: Card.cs:3071
Thing AddThing(string id, int lv=-1)
Definition: Card.cs:3085
int hp
Definition: Card.cs:242
string Name
Definition: Card.cs:2125
bool ExistsOnMap
Definition: Card.cs:2073
bool c_isPrayed
Definition: Card.cs:1072
Thing SetNum(int a)
Definition: Card.cs:3425
virtual void SetBlessedState(BlessedState s)
Definition: Card.cs:3825
bool HasTag(CTAG tag)
Definition: Card.cs:2583
Point pos
Definition: Card.cs:59
int uid
Definition: Card.cs:122
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:6043
Trait trait
Definition: Card.cs:53
int c_allowance
Definition: Card.cs:1317
Thing MakeMilk(bool effect=true, int num=1, bool addToZone=true, BlessedState? state=null)
Definition: Card.cs:5640
void SetEncLv(int a)
Definition: Card.cs:3794
void Destroy()
Definition: Card.cs:4981
bool c_isImportant
Definition: Card.cs:1024
bool noMove
Definition: Card.cs:770
bool HaveFur()
Definition: Card.cs:7709
ThingContainer things
Definition: Card.cs:38
bool IsInstalled
Definition: Card.cs:2369
int c_daysWithPC
Definition: Card.cs:1485
BedType c_bedType
Definition: Card.cs:940
void MoveImmediate(Point p, bool focus=true, bool cancelAI=true)
Definition: Card.cs:5700
Card Install()
Definition: Card.cs:3671
int Num
Definition: Card.cs:158
SourceCategory.Row category
Definition: Card.cs:2037
void ModNum(int a, bool notify=true)
Definition: Card.cs:3445
int c_fur
Definition: Card.cs:1329
int LV
Definition: Card.cs:386
bool isBackerContent
Definition: Card.cs:925
string c_idRefCard
Definition: Card.cs:1737
Thing MakeEgg(bool effect=true, int num=1, bool addToZone=true, int fertChance=20, BlessedState? state=null)
Definition: Card.cs:5624
void RemoveThings()
Definition: Card.cs:3240
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
override bool IsAliveInCurrentZone
Definition: Chara.cs:559
new TraitChara trait
Definition: Chara.cs:501
Hostility OriginalHostility
Definition: Chara.cs:469
void RemoveGlobal()
Definition: Chara.cs:1493
bool IsWealthy
Definition: Chara.cs:1053
bool CanRevive()
Definition: Chara.cs:5010
void TryPutShared(Thing t, List< Thing > containers=null, bool dropIfFail=true)
Definition: Chara.cs:4365
void CureHost(CureType type, int p=100, BlessedState state=BlessedState.Normal)
Definition: Chara.cs:9222
void RefreshWorkElements(ElementContainer parent=null)
Definition: Chara.cs:8746
Faction faction
Definition: Chara.cs:425
override bool IsPC
Definition: Chara.cs:610
bool IsMaid
Definition: Chara.cs:1025
override bool IsGlobal
Definition: Chara.cs:608
override bool IsPCParty
Definition: Chara.cs:613
Party party
Definition: Chara.cs:43
TraitBed TryAssignBed()
Definition: Chara.cs:7175
bool HasCondition(string alias)
Definition: Chara.cs:9143
Chara SetHomeZone(Zone zone)
Definition: Chara.cs:1421
Chara SetFaction(Faction f)
Definition: Chara.cs:1413
int happiness
Definition: Chara.cs:108
Chara SetGlobal(Zone _home, int x, int z)
Definition: Chara.cs:1465
bool IsAnimal
Definition: Chara.cs:865
void OnBanish()
Definition: Chara.cs:1435
bool CanEat(Thing t, bool shouldEat=false)
Definition: Chara.cs:7420
override int MaxHP
Definition: Chara.cs:706
Zone currentZone
Definition: Chara.cs:253
override bool IsDeadOrSleeping
Definition: Chara.cs:571
List< Hobby > ListHobbies(bool useMemberType=true)
Definition: Chara.cs:8707
SourceChara.Row source
Definition: Chara.cs:156
Stats mana
Definition: Chara.cs:1148
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:1140
List< Hobby > ListWorks(bool useMemberType=true)
Definition: Chara.cs:8680
void Revive(Point p=null, bool msg=false)
Definition: Chara.cs:5036
Zone homeZone
Definition: Chara.cs:265
Hobby GetWork(string id)
Definition: Chara.cs:8727
Religion faith
Definition: Chara.cs:437
void ClearBed(Map map=null)
Definition: Chara.cs:7148
FactionBranch homeBranch
Definition: Chara.cs:1064
bool isDead
Definition: Chara.cs:387
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
Definition: Chara.cs:4231
SourceRace.Row race
Definition: Chara.cs:462
bool allPolicy
Definition: CoreDebug.cs:237
bool allHomeSkill
Definition: CoreDebug.cs:195
bool enable
Definition: CoreDebug.cs:286
static void MakeDish(Thing food, int lv, Chara crafter=null)
Definition: CraftUtil.cs:61
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:68
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 int rnd(long a)
Definition: EClass.cs:58
static SourceManager sources
Definition: EClass.cs:42
static int rndHalf(int a)
Definition: EClass.cs:87
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:294
int id
Definition: ELEMENT.cs:250
SourceElement.Row source
Definition: ELEMENT.cs:273
bool HasTag(string tag)
Definition: ELEMENT.cs:473
virtual int CostLearn
Definition: ELEMENT.cs:314
int GetRoadDist(int gx, int gy)
Definition: EloMap.cs:466
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:425
ElementContainerFaction charaElements
Definition: FACTION.cs:146
bool IsGlobalPolicyActive(int id)
Definition: FACTION.cs:442
int CountTaxFreeLand()
Definition: FACTION.cs:549
ElementContainerZone elements
Definition: FACTION.cs:141
HashSet< int > globalPolicies
Definition: FACTION.cs:144
void RemoveReserve(Chara c)
Definition: FACTION.cs:357
void SetGlobalPolicyActive(int id, bool active)
Definition: FACTION.cs:455
bool isLoading
Definition: Game.cs:238
SurvivalManager survival
Definition: Game.cs:224
ReligionManager religions
Definition: Game.cs:158
CardManager cards
Definition: Game.cs:155
bool IsSurvival
Definition: Game.cs:272
FactionManager factions
Definition: Game.cs:161
Zone StartZone
Definition: Game.cs:274
void SetOwner(FactionBranch _owner)
Chara chara
Definition: HireInfo.cs:6
int Hours
Definition: HireInfo.cs:26
Definition: Hobby.cs:5
SourceHobby.Row source
Definition: Hobby.cs:8
int GetEfficiency(Chara c)
Definition: Hobby.cs:31
int GetLv(Chara c)
Definition: Hobby.cs:22
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:2592
PropsInstalled Installed
Definition: Map.cs:123
void SetDecal(int x, int z, int id=0, int amount=1, bool refresh=true)
Definition: Map.cs:2051
int CountHostile()
Definition: Map.cs:2467
List< Thing > things
Definition: Map.cs:49
int CountGuest()
Definition: Map.cs:2454
PropsManager props
Definition: Map.cs:91
int CountWildAnimal()
Definition: Map.cs:2480
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:56
bool elinGift
Definition: Player.cs:380
int days
Definition: Player.cs:75
Flags flags
Definition: Player.cs:1091
Stats stats
Definition: Player.cs:1013
string title
Definition: Player.cs:1001
bool simulatingZone
Definition: Player.cs:1176
Definition: Point.cs:9
bool HasDecal
Definition: Point.cs:139
int x
Definition: Point.cs:36
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false, int minRadius=0)
Definition: Point.cs:607
int z
Definition: Point.cs:39
Point Clamp(bool useBounds=false)
Definition: Point.cs:996
bool IsInBounds
Definition: Point.cs:104
Cell cell
Definition: Point.cs:51
Thing FindThing(Func< Thing, bool > func)
Definition: Point.cs:1128
Point GetRandomPoint(int radius, bool requireLos=true, bool allowChara=true, bool allowBlocked=false, int tries=100)
Definition: Point.cs:757
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:389
int GetNum(string id, bool onlyShared=false)
Definition: Props.cs:427
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:149
LangGame langGame
SourceElement elements
virtual string Name
Definition: Spatial.cs:509
Faction mainFaction
Definition: Spatial.cs:442
int y
Definition: Spatial.cs:106
int x
Definition: Spatial.cs:94
static SpawnSetting HomeWild(int lv)
Definition: SpawnSetting.cs:93
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
void OnUpdateRecruit(FactionBranch branch)
List< Thing > List(Func< Thing, bool > func, bool onlyAccessible=false)
Thing Find(int uid)
bool IsFull(int y=0)
static Thing CreateTreasure(string id, int lv, TreasureType type=TreasureType.Map)
Definition: ThingGen.cs:256
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:132
virtual bool RemoveGlobalOnBanish
Definition: Trait.cs:556
Point GetPoint()
Definition: Trait.cs:731
Card owner
Definition: Trait.cs:27
virtual bool CanStack
Definition: Trait.cs:150
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:3670
Thing TryGetThingFromSharedContainer(Func< Thing, bool > func)
Definition: Zone.cs:2216
ElementContainerZone elements
Definition: Zone.cs:43
Chara SpawnMob(Point pos=null, SpawnSetting setting=null)
Definition: Zone.cs:2714
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:2093
bool TryAddThing(Thing target, Point p, bool destroyIfFail=false)
Definition: Zone.cs:2190
bool IsActiveZone
Definition: Zone.cs:492
List< Element > ListLandFeats()
Definition: Zone.cs:3059
int GetSoilCost()
Definition: Zone.cs:3696
Card AddCard(Card t, Point point)
Definition: Zone.cs:1950
Map map
Definition: Zone.cs:60
Point GetSpawnPos(Chara c, ZoneTransition.EnterState destState=ZoneTransition.EnterState.Auto)
Definition: Zone.cs:1319
bool demo
Definition: Version.cs:14