Elin Decompiled Documentation EA 23.130 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 num6 *= thing4.trait.CraftNum;
834 if (thing4.category.id == "fish" && EClass.rnd(EClass.debug.enable ? 1 : 5) == 0)
835 {
836 int num7 = Mathf.Min(EClass.rnd(EClass.rnd(EClass.rnd(EClass.curve(num4, 100, 50, 70) + 50))) / 50, 3);
837 if (num7 > 0)
838 {
839 thing4.SetTier(num7);
840 num6 /= num7 + 1;
841 }
842 }
843 if (num6 < 1)
844 {
845 num6 = 1;
846 }
847 if (!thing4.trait.CanStack)
848 {
849 num6 = 1;
850 }
851 thing4.SetNum(num6);
852 thing4.SetBlessedState(BlessedState.Normal);
853 thing4.TryMakeRandomItem(num4);
854 if (thing4.IsAmmo)
855 {
856 thing4.ChangeMaterial("iron");
857 thing4.c_IDTState = 0;
858 }
859 bool flag = thing4.category.id == "garbage";
860 if (thing4.trait is TraitFoodMeal)
861 {
862 if (thing4.HasTag(CTAG.dish_fail))
863 {
864 flag = true;
865 }
866 else
867 {
868 CraftUtil.MakeDish(thing4, num4 + 10, i);
869 }
870 }
871 if (flag)
872 {
873 TryTrash(thing4);
874 }
875 else
876 {
877 i.TryPutShared(thing4);
878 }
879 }
880 }
881 }
882 else
883 {
884 i.MakeEgg(date.IsRealTime, num6);
885 }
886 }
887 }
888 switch (h.source.alias)
889 {
890 case "Nurse":
891 {
892 foreach (Chara member2 in members)
893 {
894 if (!member2.IsPCParty)
895 {
896 if (member2.isDead && member2.CanRevive() && EClass.rnd(num3) > EClass.rnd(100))
897 {
898 Log("bNurse", i, member2);
899 member2.Revive(member2.pos, msg: true);
900 if (date.IsRealTime && member2.c_wasInPcParty)
901 {
902 EClass.pc.party.AddMemeber(member2, showMsg: true);
903 }
904 break;
905 }
906 if (EClass.rnd(num3) > EClass.rnd(100))
907 {
908 member2.CureHost(CureType.HealComplete);
909 }
910 }
911 }
912 break;
913 }
914 case "Chore":
915 case "Clean":
916 {
917 for (int k = 0; k < num3 / 2; k++)
918 {
919 Point randomPoint = EClass._map.bounds.GetRandomPoint();
920 if (randomPoint.HasDecal)
921 {
922 EClass._map.SetDecal(randomPoint.x, randomPoint.z);
923 }
924 }
925 break;
926 }
927 case "TreasureHunt":
928 if (EClass.rnd(num3) > EClass.rnd(EClass.debug.enable ? 100 : 5000))
929 {
931 if (thing5 != null)
932 {
933 Thing thing6 = ThingGen.CreateTreasure("chest_treasure", thing5.LV);
934 i.TryPutShared(thing6);
935 thing5.Destroy();
936 WidgetPopText.Say("foundTreasure".lang(thing6.Name));
937 }
938 }
939 break;
940 }
941 }
942 }
943 int soilCost = EClass._zone.GetSoilCost();
944 int num = Mathf.Min(100, 70 + (MaxSoil - soilCost));
945 int flower = 5;
946 int lv = 1;
947 EClass._map.bounds.ForeachCell(delegate(Cell cell)
948 {
949 if (cell.obj != 0 && cell.sourceObj.tag.Contains("flower"))
950 {
951 PlantData plantData = cell.TryGetPlant();
952 if (plantData != null && plantData.seed != null)
953 {
954 lv += plantData.seed.encLV + 1;
955 }
956 else
957 {
958 lv++;
959 }
960 flower++;
961 }
962 });
963 lv /= flower;
964 int num2 = 0;
965 foreach (Thing thing7 in EClass._map.things)
966 {
967 if (thing7.IsInstalled && thing7.trait is TraitBeekeep && !thing7.things.IsFull())
968 {
969 flower -= 3 + EClass.rnd(5 + num2 * 4);
970 num2++;
971 if (flower < 0)
972 {
973 break;
974 }
975 if (EClass.rnd(100) <= num)
976 {
977 Thing thing3 = ThingGen.Create("honey");
978 thing3.SetEncLv(lv / 10);
979 thing3.elements.SetBase(2, EClass.curve(lv, 50, 10, 80));
980 thing7.AddThing(thing3);
981 }
982 }
983 }
984 }
985
986 public void PutInMailBox(Thing t, bool outside = false, bool install = true)
987 {
988 if (!outside)
989 {
990 Thing mailBox = GetMailBox();
991 if (mailBox != null)
992 {
993 mailBox.AddCard(t);
994 return;
995 }
996 }
997 Point mailBoxPos = GetMailBoxPos();
998 EClass._zone.AddCard(t, mailBoxPos);
999 if (install)
1000 {
1001 t.Install();
1002 }
1003 }
1004
1006 {
1007 return EClass._map.props.installed.FindEmptyContainer<TraitMailPost>();
1008 }
1009
1011 {
1012 Thing thing = GetMailBox();
1013 if (thing == null)
1014 {
1016 }
1017 if (thing != null)
1018 {
1019 return thing.pos.GetNearestPoint(allowBlock: false, allowChara: true, allowInstalled: false, ignoreCenter: true).Clamp(useBounds: true);
1020 }
1021 return EClass._map.GetCenterPos();
1022 }
1023
1024 public int GetResidentTax()
1025 {
1026 if (!policies.IsActive(2512, 30))
1027 {
1028 return 0;
1029 }
1030 int num = 0;
1031 int num2 = (policies.IsActive(2500, 30) ? Evalue(2500) : 0);
1032 int num3 = (policies.IsActive(2501, 30) ? Evalue(2501) : 0);
1033 int num4 = 50 + (int)Mathf.Sqrt(Evalue(2512)) * 5;
1034 foreach (Chara member in members)
1035 {
1036 if (member.IsPC || member.memberType != 0)
1037 {
1038 continue;
1039 }
1040 bool isWealthy = member.IsWealthy;
1041 int num5 = 0;
1042 foreach (Hobby item in member.ListWorks().Concat(member.ListHobbies()))
1043 {
1044 int num6 = item.source.tax * 100 / 100;
1045 if (num6 > num5)
1046 {
1047 num5 = num6;
1048 }
1049 }
1050 int num7 = ((isWealthy ? 50 : 10) + member.LV * 2) * num5 / 100 * num4 / 100;
1051 if (isWealthy && num2 > 0)
1052 {
1053 num7 = num7 * (150 + (int)Mathf.Sqrt(num2) * 5) / 100;
1054 }
1055 if (num3 > 0)
1056 {
1057 num7 += (80 + (int)Mathf.Sqrt(num3) * 5) * member.faith.source.tax / 100;
1058 }
1059 num7 = num7 * efficiency / (IsTaxFree ? 100 : 1000);
1060 num += num7;
1061 if (num7 > 0)
1062 {
1063 Log("bTax", num7.ToString() ?? "", member.Name);
1064 }
1065 }
1066 statistics.tax += num;
1067 return num;
1068 }
1069
1070 public void CalcInnIncome()
1071 {
1072 int num = CountGuests();
1073 if (num == 0)
1074 {
1075 return;
1076 }
1077 int num2 = 0;
1078 int num3 = 0;
1079 foreach (Thing thing in EClass._map.things)
1080 {
1081 if (thing.IsInstalled && thing.trait is TraitBed traitBed && traitBed.owner.c_bedType == BedType.guest)
1082 {
1083 int maxHolders = traitBed.MaxHolders;
1084 num2 += maxHolders;
1085 num3 += traitBed.owner.LV * (100 + traitBed.owner.Quality / 2 + traitBed.owner.Evalue(750) / 2) / 100 * maxHolders;
1086 }
1087 }
1088 num = Mathf.Min(num, num2);
1089 if (num != 0)
1090 {
1091 num3 /= num2;
1092 num3 = num3 * (100 + 5 * (int)Mathf.Sqrt(Evalue(2812))) / 100;
1093 float num4 = 10f + Mathf.Sqrt(num) * 10f;
1094 if (policies.IsActive(2813))
1095 {
1096 num4 += Mathf.Sqrt(CountWealthyGuests()) * 50f * (80f + 5f * Mathf.Sqrt(Evalue(2813))) / 100f;
1097 }
1098 if (policies.IsActive(2812))
1099 {
1100 num4 = num4 * (float)(100 + num3) / 100f;
1101 }
1102 num4 = Mathf.Min(num4, Mathf.Sqrt(Worth) / 15f + 5f);
1103 incomeInn += EClass.rndHalf((int)num4) + EClass.rndHalf((int)num4);
1104 }
1105 }
1106
1107 public void CalcTourismIncome()
1108 {
1109 int num = CountGuests();
1110 if (num != 0)
1111 {
1112 float num2 = 10f + Mathf.Sqrt(num) * 10f;
1113 if (policies.IsActive(2815))
1114 {
1115 num2 += Mathf.Sqrt(CountWealthyGuests()) * 50f * (80f + 5f * Mathf.Sqrt(Evalue(2815))) / 100f;
1116 }
1117 num2 = Mathf.Min(num2, Mathf.Sqrt(tourism) / 5f);
1118 incomeTourism += EClass.rndHalf((int)num2) + EClass.rndHalf((int)num2);
1119 }
1120 }
1121
1122 public void GetDailyIncome()
1123 {
1124 GetIncome(ref incomeShop, ref statistics.shop, "getIncomeShop", tax: false);
1125 GetIncome(ref incomeInn, ref statistics.inn, "getIncomeInn", tax: true);
1126 GetIncome(ref incomeTourism, ref statistics.tourism, "getIncomeTourism", tax: true);
1127 void GetIncome(ref int n, ref int stat, string lang, bool tax)
1128 {
1129 if (tax && !IsTaxFree)
1130 {
1131 n = n * 10 / 100;
1132 }
1133 if (n != 0)
1134 {
1135 Msg.Say(lang, Lang._currency(n, "money"), owner.Name);
1136 Thing t = ThingGen.Create("money").SetNum(n);
1137 EClass.pc.Pick(t);
1138 stat += n;
1139 n = 0;
1140 }
1141 }
1142 }
1143
1145 {
1146 if (c.things.IsFull())
1147 {
1148 return null;
1149 }
1150 Thing thing = EClass._zone.TryGetThingFromSharedContainer((Thing t) => c.CanEat(t, shouldEat: true) && !t.c_isImportant);
1151 if (thing != null)
1152 {
1153 thing = thing.Split(1);
1154 }
1155 return thing;
1156 }
1157
1158 public void OnClaimZone()
1159 {
1161 {
1162 foreach (SourceElement.Row item in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "tech"))
1163 {
1164 elements.SetBase(item.id, 1);
1165 }
1166 foreach (SourceElement.Row item2 in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "policy" && !a.tag.Contains("hidden")))
1167 {
1168 policies.AddPolicy(item2.id);
1169 }
1170 }
1171 else
1172 {
1173 elements.SetBase(2003, 1);
1174 elements.SetBase(4002, 1);
1175 elements.SetBase(2115, 1);
1176 elements.SetBase(2204, 1);
1177 elements.SetBase(2120, 1);
1178 policies.AddPolicy(2512);
1179 policies.AddPolicy(2702);
1180 policies.AddPolicy(2703);
1181 policies.AddPolicy(2516);
1182 policies.AddPolicy(2515);
1183 policies.AddPolicy(2514);
1184 }
1186 {
1187 policies.Activate(2514);
1188 }
1189 Element element = EClass._zone.ListLandFeats()[0];
1190 elements.SetBase(element.id, 1);
1191 switch (element.id)
1192 {
1193 case 3604:
1194 elements.SetBase(2206, 10);
1195 break;
1196 case 3602:
1197 elements.SetBase(2206, 15);
1198 break;
1199 }
1200 if (EClass.game.StartZone == owner || owner is Zone_Vernis)
1201 {
1202 AddMemeber(EClass.pc);
1203 }
1205 {
1206 foreach (SourceElement.Row item3 in EClass.sources.elements.rows.Where((SourceElement.Row a) => a.category == "policy"))
1207 {
1208 policies.AddPolicy(item3.id);
1209 }
1210 }
1211 ValidateUpgradePolicies();
1212 }
1213
1214 public void OnUnclaimZone()
1215 {
1216 List<Element> list = owner.ListLandFeats();
1217 elements.SetBase(list[1].id, 0);
1218 elements.SetBase(list[2].id, 0);
1219 if (lv < 5)
1220 {
1221 return;
1222 }
1223 foreach (Element item in list.Where((Element a) => a.HasTag("network")).ToList())
1224 {
1226 }
1227 }
1228
1230 {
1231 if (lv >= 2)
1232 {
1233 if (!policies.HasPolicy(2705))
1234 {
1235 policies.AddPolicy(2705);
1237 }
1238 if (!policies.HasPolicy(2708))
1239 {
1240 policies.AddPolicy(2708);
1242 }
1243 if (!policies.HasPolicy(2707))
1244 {
1245 policies.AddPolicy(2707);
1246 }
1247 if (!policies.HasPolicy(2709))
1248 {
1249 policies.AddPolicy(2709);
1250 }
1251 if (!policies.HasPolicy(2715))
1252 {
1253 policies.AddPolicy(2715);
1254 }
1255 }
1256 foreach (int globalPolicy in EClass.pc.faction.globalPolicies)
1257 {
1258 if (!policies.HasPolicy(globalPolicy))
1259 {
1260 policies.AddPolicy(globalPolicy, show: false);
1262 }
1263 }
1264 }
1265
1266 public void Upgrade()
1267 {
1268 List<Element> list = owner.ListLandFeats();
1269 if (owner.IsActiveZone)
1270 {
1271 TraitCoreZone traitCoreZone = EClass._map.FindThing<TraitCoreZone>();
1272 if (traitCoreZone != null)
1273 {
1274 SE.Play("godbless");
1275 traitCoreZone.owner.PlayEffect("aura_heaven");
1276 }
1277 }
1278 lv++;
1279 exp = 0;
1280 int admin = 4;
1281 int food = 4;
1282 Set(4, 3);
1283 switch (list[0].id)
1284 {
1285 case 3500:
1286 Set(5, 3);
1287 break;
1288 case 3604:
1289 Set(4, 3);
1290 break;
1291 case 3600:
1292 Set(5, 3);
1293 break;
1294 case 3601:
1295 Set(4, 4);
1296 break;
1297 case 3603:
1298 Set(6, 2);
1299 break;
1300 case 3602:
1301 Set(5, 2);
1302 break;
1303 }
1304 elements.SetBase(2003, Mathf.Min((lv - 1) * 2 + 1, 10));
1305 elements.SetBase(2115, (lv - 1) * admin + 1);
1306 elements.SetBase(2204, (lv - 1) * food + 1);
1307 elements.GetElement(2003).CheckLevelBonus(elements);
1308 ValidateUpgradePolicies();
1309 if (lv == 4)
1310 {
1311 elements.SetBase(list[1].id, 1);
1312 }
1313 if (lv == 7)
1314 {
1315 elements.SetBase(list[2].id, 1);
1316 }
1317 if (lv >= 5)
1318 {
1319 List<Element> list2 = elements.dict.Values.Where((Element a) => a.source.category == "landfeat" && a.HasTag("network")).ToList();
1320 foreach (Element item in list2)
1321 {
1323 }
1324 foreach (Element item2 in list2)
1325 {
1326 elements.Remove(item2.id);
1327 }
1328 }
1329 Msg.Say("upgrade_hearth", lv.ToString() ?? "", owner.Name);
1330 LogRaw("upgrade_hearth".langGame(lv.ToString() ?? "", owner.Name), "Good");
1331 Tutorial.Reserve("stone");
1332 void Set(int a, int f)
1333 {
1334 admin = a;
1335 food = f;
1336 }
1337 }
1338
1339 public bool CanUpgrade()
1340 {
1341 if (lv < MaxLv)
1342 {
1343 if (exp < GetNextExp())
1344 {
1345 return EClass.debug.enable;
1346 }
1347 return true;
1348 }
1349 return false;
1350 }
1351
1352 public int GetUpgradeCost()
1353 {
1354 return lv * lv * lv * 1000;
1355 }
1356
1357 public void ModExp(int a)
1358 {
1359 if (policies.IsActive(2515))
1360 {
1361 return;
1362 }
1363 if (policies.IsActive(2516))
1364 {
1365 a = a * 150 / 100 + EClass.rnd(2);
1366 }
1367 exp += a;
1368 if (exp >= GetNextExp() && CanUpgrade())
1369 {
1370 if (EClass.core.version.demo && lv >= 3)
1371 {
1372 exp = 0;
1373 Msg.Say("demoLimit2");
1374 }
1375 else
1376 {
1377 Upgrade();
1378 }
1379 }
1380 }
1381
1382 public string GetHearthHint(int a)
1383 {
1384 if (a <= 1)
1385 {
1386 return "hearth1".lang();
1387 }
1388 string text = "";
1389 for (int i = 1; i < a; i++)
1390 {
1391 string text2 = ("hearth" + (i + 1)).lang();
1392 if (!text2.IsEmpty())
1393 {
1394 text = text + text2 + Environment.NewLine;
1395 }
1396 }
1397 return text.TrimEnd(Environment.NewLine.ToCharArray());
1398 }
1399
1400 public void AddFeat(int ele, int v)
1401 {
1402 elements.ModBase(ele, v);
1403 WidgetPopText.Say("rewardElement".lang(EClass.sources.elements.map[ele].GetName()));
1404 }
1405
1406 public void AddMemeber(Chara c)
1407 {
1408 if (members.Contains(c))
1409 {
1410 return;
1411 }
1414 c.SetGlobal();
1416 c.SetHomeZone(owner);
1417 foreach (Thing item in c.things.List((Thing a) => a.HasTag(CTAG.godArtifact)).Copy())
1418 {
1420 }
1421 if (c.OriginalHostility <= Hostility.Ally)
1422 {
1423 c.c_originalHostility = Hostility.Ally;
1424 }
1425 c.hostility = Hostility.Ally;
1426 c.enemy = null;
1427 c.orgPos = null;
1428 if (c.memberType != 0 && c.memberType != FactionMemberType.Livestock)
1429 {
1430 c.memberType = FactionMemberType.Default;
1431 }
1432 if (c.hp > c.MaxHP)
1433 {
1434 c.hp = c.MaxHP;
1435 }
1436 if (c.mana.value > c.mana.max)
1437 {
1438 c.mana.value = c.mana.max;
1439 }
1440 if (c.stamina.value > c.stamina.max)
1441 {
1442 c.stamina.value = c.stamina.max;
1443 }
1444 members.Add(c);
1446 RefreshEfficiency();
1447 c.RefreshWorkElements(elements);
1448 if (uidMaid == 0 && c.id == "maid")
1449 {
1450 uidMaid = c.uid;
1451 }
1452 }
1453
1455 {
1456 c.ClearBed();
1457 c.memberType = type;
1458 c.c_wasInPcParty = false;
1459 RefreshEfficiency();
1460 c.RefreshWorkElements(elements);
1461 policies.Validate();
1462 }
1463
1464 public void BanishMember(Chara c, bool skipMsg = false)
1465 {
1466 RemoveMemeber(c);
1467 if (!skipMsg)
1468 {
1469 Msg.Say("banish", c, EClass._zone.Name);
1470 }
1471 if (c.IsGlobal)
1472 {
1473 c.OnBanish();
1474 }
1475 else
1476 {
1477 c.Destroy();
1478 }
1479 }
1480
1481 public void RemoveMemeber(Chara c)
1482 {
1483 c.isSale = false;
1484 if (c.currentZone != null && c.currentZone.map != null)
1485 {
1487 c.currentZone.map.props.sales.Remove(c);
1488 }
1490 c.RemoveGlobal();
1491 members.Remove(c);
1494 policies.Validate();
1495 RefreshEfficiency();
1496 }
1497
1499 {
1500 float num = 0f;
1501 if (members.Count == 0)
1502 {
1503 return 0;
1504 }
1505 foreach (Chara member in members)
1506 {
1507 num += (float)member.happiness;
1508 }
1509 return (int)(num / (float)members.Count);
1510 }
1511
1512 public bool IsAllDead()
1513 {
1514 foreach (Chara member in members)
1515 {
1516 if (!member.isDead)
1517 {
1518 return false;
1519 }
1520 }
1521 return true;
1522 }
1523
1524 public void Recruit(Chara c)
1525 {
1526 RemoveRecruit(c);
1527 AddMemeber(c);
1528 c.isRestrained = false;
1529 if (c.currentZone != EClass._zone && !c.isDead)
1530 {
1532 EClass._zone.AddCard(c, point);
1533 }
1534 RefreshEfficiency();
1536 Msg.Say("hire".langGame(c.Name));
1537 }
1538
1540 {
1541 foreach (Chara member in members)
1542 {
1543 if (member.IsAliveInCurrentZone && member.IsMaid)
1544 {
1545 return member;
1546 }
1547 }
1548 return null;
1549 }
1550
1551 public string GetRandomName()
1552 {
1553 if (EClass.rnd(4) == 0 || members.Count == 0)
1554 {
1555 return EClass.player.title;
1556 }
1557 return members.RandomItem().Name;
1558 }
1559
1560 public int CountMembers(FactionMemberType type, bool onlyAlive = false)
1561 {
1562 int num = 0;
1563 foreach (Chara member in members)
1564 {
1565 if (member.memberType == type && (!onlyAlive || !member.isDead) && (type != 0 || member.trait.IsCountAsResident))
1566 {
1567 num++;
1568 }
1569 }
1570 return num;
1571 }
1572
1573 public int CountGuests()
1574 {
1575 int num = 0;
1576 foreach (Chara chara in EClass._map.charas)
1577 {
1578 if (chara.memberType == FactionMemberType.Guest)
1579 {
1580 num++;
1581 }
1582 }
1583 return num;
1584 }
1585
1587 {
1588 int num = 0;
1589 foreach (Chara chara in EClass._map.charas)
1590 {
1591 if (chara.memberType == FactionMemberType.Guest && chara.IsWealthy)
1592 {
1593 num++;
1594 }
1595 }
1596 return num;
1597 }
1598
1599 public void UpdateReqruits(bool clear = false)
1600 {
1601 resources.Refresh();
1602 if (clear)
1603 {
1604 listRecruit.ForeachReverse(delegate(HireInfo i)
1605 {
1606 if (!i.chara.IsGlobal)
1607 {
1608 i.chara.Destroy();
1609 }
1610 if (i.chara.isDestroyed)
1611 {
1612 listRecruit.Remove(i);
1613 }
1614 });
1615 listRecruit.Clear();
1616 lastUpdateReqruit = -1;
1617 }
1618 else
1619 {
1620 listRecruit.ForeachReverse(delegate(HireInfo i)
1621 {
1622 if (i.Hours < 0)
1623 {
1624 if (!i.chara.IsGlobal)
1625 {
1626 i.chara.Destroy();
1627 }
1628 listRecruit.Remove(i);
1629 }
1630 });
1631 }
1632 if (lastUpdateReqruit == EClass.world.date.day)
1633 {
1634 return;
1635 }
1636 lastUpdateReqruit = EClass.world.date.day;
1637 int num = 2 + (int)Mathf.Sqrt(Evalue(2513)) / 2;
1638 int num2 = EClass.rnd(3 + (int)Mathf.Sqrt(Evalue(2513)) / 2) + num - listRecruit.Count;
1639 if (num2 <= 0)
1640 {
1641 return;
1642 }
1643 new List<Chara>(EClass.game.cards.globalCharas.Values).Shuffle();
1644 for (int j = 0; j < num2; j++)
1645 {
1646 Chara chara = CharaGen.CreateFromFilter("c_neutral", ContentLV + Mathf.Min(EClass.player.stats.days, 10));
1647 if (chara.isBackerContent || chara.source.quality != 0)
1648 {
1649 j--;
1650 }
1651 else
1652 {
1653 AddRecruit(chara);
1654 }
1655 }
1656 }
1657
1658 public void AddRecruit(Chara c)
1659 {
1660 HireInfo hireInfo = new HireInfo
1661 {
1662 chara = c,
1663 isNew = true
1664 };
1665 hireInfo.deadline = EClass.world.date.GetRaw() + (EClass.rnd(5) + 1) * 1440 + EClass.rnd(24) * 60;
1666 listRecruit.Add(hireInfo);
1667 }
1668
1669 public void RemoveRecruit(Chara c)
1670 {
1671 listRecruit.ForeachReverse(delegate(HireInfo i)
1672 {
1673 if (i.chara == c)
1674 {
1675 listRecruit.Remove(i);
1676 }
1677 });
1678 }
1679
1680 public int CountNewRecruits()
1681 {
1682 int num = 0;
1683 foreach (HireInfo item in listRecruit)
1684 {
1685 if (item.isNew)
1686 {
1687 num++;
1688 }
1689 }
1690 return num;
1691 }
1692
1693 public void ClearNewRecruits()
1694 {
1695 foreach (HireInfo item in listRecruit)
1696 {
1697 item.isNew = false;
1698 }
1699 }
1700
1701 public bool IsRecruit(Chara c)
1702 {
1703 foreach (HireInfo item in listRecruit)
1704 {
1705 if (item.chara == c)
1706 {
1707 return true;
1708 }
1709 }
1710 return false;
1711 }
1712
1713 public int CountPasture()
1714 {
1715 return EClass._map.Stocked.GetNum("pasture", onlyShared: true) + EClass._map.Installed.GetNum("pasture");
1716 }
1717
1718 public int GetPastureCost()
1719 {
1720 return CountMembers(FactionMemberType.Livestock);
1721 }
1722
1723 public int GetCivility()
1724 {
1725 int num = 10 + Evalue(2203);
1726 if (Evalue(2701) > 0)
1727 {
1728 num += 10 + (int)Mathf.Sqrt(Evalue(2701));
1729 }
1730 if (Evalue(2702) > 0)
1731 {
1732 num -= 10 + (int)Mathf.Sqrt(Evalue(2702));
1733 }
1734 return num;
1735 }
1736
1737 public float GetHearthIncome()
1738 {
1739 float num = 0f;
1740 foreach (Element value in elements.dict.Values)
1741 {
1742 if (value.source.category == "culture")
1743 {
1744 num += GetHearthIncome(value.source.alias);
1745 }
1746 }
1747 return num;
1748 }
1749
1750 public float GetHearthIncome(string id)
1751 {
1752 int num = 0;
1753 foreach (KeyValuePair<int, Element> item in elements.dict)
1754 {
1755 if (item.Value.source.aliasParent == id)
1756 {
1757 num++;
1758 }
1759 }
1760 return 0.2f * (float)num;
1761 }
1762
1764 {
1765 int valueWithoutLink = e.ValueWithoutLink;
1766 valueWithoutLink += e.CostLearn;
1767 if (e.source.max != 0 && e.ValueWithoutLink >= e.source.max)
1768 {
1769 return 0;
1770 }
1771 return valueWithoutLink;
1772 }
1773
1774 public string Log(string idLang, string ref1 = null, string ref2 = null, string ref3 = null, string ref4 = null)
1775 {
1776 Msg.alwaysVisible = true;
1777 return LogRaw(Msg.GetRawText(idLang, ref1, ref2, ref3, ref4), EClass.sources.langGame.map[idLang].logColor);
1778 }
1779
1780 public string Log(string idLang, Card c1, Card c2, string ref1 = null, string ref2 = null)
1781 {
1782 Msg.alwaysVisible = true;
1783 return LogRaw(Msg.GetRawText(idLang, c1, c2, ref1, ref2), EClass.sources.langGame.map[idLang].logColor);
1784 }
1785
1786 public string Log(string idLang, Card c1, string ref1 = null, string ref2 = null, string ref3 = null)
1787 {
1788 Msg.alwaysVisible = true;
1789 return LogRaw(Msg.GetRawText(idLang, c1, ref1, ref2, ref3), EClass.sources.langGame.map[idLang].logColor);
1790 }
1791
1792 public string LogRaw(string text, string col = null)
1793 {
1794 log.Add(text, col.IsEmpty() ? null : col);
1795 Msg.alwaysVisible = false;
1796 Msg.SetColor();
1797 return text;
1798 }
1799}
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
void SetTier(int a, bool setTraits=true)
Definition: Card.cs:3616
bool isDestroyed
Definition: Card.cs:71
void PurgeDuplicateArtifact(Thing af)
Definition: Card.cs:3068
bool IsAmmo
Definition: Card.cs:2147
Thing Split(int a)
Definition: Card.cs:3275
ElementContainerCard elements
Definition: Card.cs:37
bool c_wasInPcParty
Definition: Card.cs:972
string id
Definition: Card.cs:31
bool IsUnique
Definition: Card.cs:1991
bool isRestrained
Definition: Card.cs:538
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:5585
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:2887
Card AddCard(Card c)
Definition: Card.cs:2936
Thing AddThing(string id, int lv=-1)
Definition: Card.cs:2950
int hp
Definition: Card.cs:226
string Name
Definition: Card.cs:2037
bool ExistsOnMap
Definition: Card.cs:1985
bool c_isPrayed
Definition: Card.cs:1032
Thing SetNum(int a)
Definition: Card.cs:3286
virtual void SetBlessedState(BlessedState s)
Definition: Card.cs:3642
bool HasTag(CTAG tag)
Definition: Card.cs:2495
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:5619
Trait trait
Definition: Card.cs:49
int c_allowance
Definition: Card.cs:1277
void SetEncLv(int a)
Definition: Card.cs:3611
void Destroy()
Definition: Card.cs:4680
bool c_isImportant
Definition: Card.cs:984
bool noMove
Definition: Card.cs:742
bool HaveFur()
Definition: Card.cs:7230
ThingContainer things
Definition: Card.cs:34
bool IsInstalled
Definition: Card.cs:2281
BedType c_bedType
Definition: Card.cs:900
void MoveImmediate(Point p, bool focus=true, bool cancelAI=true)
Definition: Card.cs:5308
Thing TryMakeRandomItem(int lv=-1)
Definition: Card.cs:5030
Card Install()
Definition: Card.cs:3492
int Num
Definition: Card.cs:154
SourceCategory.Row category
Definition: Card.cs:1949
void ModNum(int a, bool notify=true)
Definition: Card.cs:3306
int c_fur
Definition: Card.cs:1289
int LV
Definition: Card.cs:370
bool isBackerContent
Definition: Card.cs:885
string c_idRefCard
Definition: Card.cs:1661
void RemoveThings()
Definition: Card.cs:3101
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:1239
override bool IsAliveInCurrentZone
Definition: Chara.cs:551
new TraitChara trait
Definition: Chara.cs:493
Hostility OriginalHostility
Definition: Chara.cs:461
void RemoveGlobal()
Definition: Chara.cs:1303
void SetFaction(Faction f)
Definition: Chara.cs:1232
bool IsWealthy
Definition: Chara.cs:883
bool CanRevive()
Definition: Chara.cs:4643
void TryPutShared(Thing t, List< Thing > containers=null, bool dropIfFail=true)
Definition: Chara.cs:4074
void CureHost(CureType type, int p=100, BlessedState state=BlessedState.Normal)
Definition: Chara.cs:8732
void RefreshWorkElements(ElementContainer parent=null)
Definition: Chara.cs:8273
Faction faction
Definition: Chara.cs:417
override bool IsPC
Definition: Chara.cs:602
bool IsMaid
Definition: Chara.cs:855
override bool IsGlobal
Definition: Chara.cs:600
override bool IsPCParty
Definition: Chara.cs:605
Party party
Definition: Chara.cs:43
TraitBed TryAssignBed()
Definition: Chara.cs:6713
bool HasCondition(string alias)
Definition: Chara.cs:8666
int happiness
Definition: Chara.cs:108
Chara SetGlobal(Zone _home, int x, int z)
Definition: Chara.cs:1275
void OnBanish()
Definition: Chara.cs:1245
bool CanEat(Thing t, bool shouldEat=false)
Definition: Chara.cs:6959
override int MaxHP
Definition: Chara.cs:698
Zone currentZone
Definition: Chara.cs:245
override bool IsDeadOrSleeping
Definition: Chara.cs:563
List< Hobby > ListHobbies(bool useMemberType=true)
Definition: Chara.cs:8234
SourceChara.Row source
Definition: Chara.cs:148
Stats mana
Definition: Chara.cs:968
FactionMemberType memberType
Definition: Chara.cs:46
Stats stamina
Definition: Chara.cs:960
List< Hobby > ListWorks(bool useMemberType=true)
Definition: Chara.cs:8207
void Revive(Point p=null, bool msg=false)
Definition: Chara.cs:4669
Zone homeZone
Definition: Chara.cs:257
Hobby GetWork(string id)
Definition: Chara.cs:8254
Religion faith
Definition: Chara.cs:429
void ClearBed(Map map=null)
Definition: Chara.cs:6686
FactionBranch homeBranch
Definition: Chara.cs:894
Thing MakeMilk(bool effect=true, int num=1, bool addToZone=true)
Definition: Chara.cs:7478
bool isDead
Definition: Chara.cs:379
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
Definition: Chara.cs:3940
Thing MakeEgg(bool effect=true, int num=1, bool addToZone=true)
Definition: Chara.cs:7498
SourceRace.Row race
Definition: Chara.cs:454
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:55
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:63
static int rnd(int a)
Definition: EClass.cs:58
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:82
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:290
int id
Definition: ELEMENT.cs:246
SourceElement.Row source
Definition: ELEMENT.cs:269
bool HasTag(string tag)
Definition: ELEMENT.cs:469
virtual int CostLearn
Definition: ELEMENT.cs:310
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:910
Stats stats
Definition: Player.cs:832
string title
Definition: Player.cs:820
bool simulatingZone
Definition: Player.cs:995
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:984
bool IsInBounds
Definition: Point.cs:104
Cell cell
Definition: Point.cs:51
Thing FindThing(Func< Thing, bool > func)
Definition: Point.cs:1116
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false)
Definition: Point.cs:607
Point GetRandomPoint(int radius, bool requireLos=true, bool allowChara=true, bool allowBlocked=false, int tries=100)
Definition: Point.cs:753
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:145
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
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:217
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:131
Point GetPoint()
Definition: Trait.cs:722
Card owner
Definition: Trait.cs:26
virtual bool CanStack
Definition: Trait.cs:149
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:3427
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:2565
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:2854
int GetSoilCost()
Definition: Zone.cs:3453
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