2using System.Collections.Generic;
55 public Dictionary<int, string>
dictCitizen =
new Dictionary<int, string>();
86 public static List<Thing>
Suckers =
new List<Thing>();
98 base.uidBoss = value?.
uid ?? 0;
148 public virtual string IDPlayList => base.source.idPlaylist.IsEmpty((base.lv != 0) ?
"Underground" :
null);
152 public virtual string IDHat =>
null;
160 if (base.source.idFile.Length != 0)
162 return base.source.idFile[
fileVariation] + ((base.lv == 0) ?
"" : (
"_F" + base.lv));
168 public string pathTemp => GameIO.pathTemp + base.uid +
"/";
286 public virtual int MaxLv => 99999999;
288 public virtual int MinLv => -99999999;
320 public virtual int MaxSpawn => map.bounds.Width * map.bounds.Height / 175 + 2;
366 return base.source.tag.Contains(
"return");
378 return base.lv <
MaxLv;
398 public virtual bool UseFog => base.lv < 0;
410 return base.source.tag.Contains(
"light");
422 public virtual FlockController.SpawnType
FlockType => FlockController.SpawnType.Default;
432 return "conquered".lang();
536 if (destLv == base.lv)
558 zoneFullName = zoneFullName.Replace(
'/',
'@');
559 int num = zoneFullName.LastIndexOf(
'@');
561 if (num > 0 && num < zoneFullName.Length - 1)
563 text = zoneFullName[..num];
564 item = zoneFullName[(num + 1)..].ToInt();
568 text = zoneFullName.Replace(
"@",
"");
570 string text2 = text.Replace(
"Zone_",
"");
571 text =
"Zone_" + text2;
597 return base.source.id;
611 return " " +
"zoneLevelB".lang((_lv * -1).
ToString() ??
"");
613 return " " +
"zoneLevel".lang((_lv + 1).
ToString() ??
"");
647 EClass.game.config.reverseSnow =
false;
654 EClass.pc.global.transition.uidLastZone = 0;
662 EClass.game.activeZone =
this;
664 Debug.Log(
NameWithLevel +
"/" +
id +
"/" + base.uid +
"/" + base.isGenerated +
"/" +
IsLoaded +
"/" + File.Exists(base.pathSave +
"map"));
665 if (base.isGenerated && !
IsLoaded && !File.Exists(base.pathSave +
"map"))
667 Debug.Log(
"(Bug) File does not exist:" +
destryoed +
"/" + base.pathSave);
668 base.isGenerated =
false;
673 if (flag2 &&
map !=
null)
678 string lhs = CorePath.ZoneSave +
"_new.z";
679 bool flag3 = File.Exists(fullName) && !PathComparer.Default.Equals(lhs, fullName);
682 if (!flag3 && (base.source.tag.Contains(
"addMap") || flag4))
684 string[] array =
new string[4]
691 for (
int i = 0; i < array.Length; i++)
693 FileInfo fileInfo = PackageIterator.GetFiles(array[i]).LastOrDefault();
694 if (fileInfo !=
null)
696 fullName = fileInfo.FullName;
703 if (!base.isGenerated && (!flag4 || !flag3))
705 Debug.Log(
"generating random map");
728 Debug.Log(
"zone is already loaded");
742 Debug.Log(base.isGenerated +
"/" + flag5 +
"/" + flag2 +
"/" +
IDSubset);
743 if (!base.isGenerated || flag5 || flag2)
745 Debug.Log(
"importing map:" + fullName);
750 IO.DeleteDirectory(
pathTemp +
"Texture Replace");
755 zoneExportData =
Import(fullName);
756 base.isGenerated =
true;
760 zoneExportData.orgMap =
GameIO.LoadFile<
Map>(base.pathSave +
"map");
763 catch (Exception message)
767 base.isGenerated =
true;
772 Debug.Log(
"loading map: imported? " +
isImported +
" regenerate? " + flag5);
778 catch (Exception message2)
780 EClass.
ui.Say(
$"Can't load map '{base.uid}/{Name}'; File may be corrupted.\n" +
"Try replacing the following file if you have a backup:\n" + text +
"\nDefault file is at:\n" + fullName);
781 Debug.LogError(message2);
799 if (zoneExportData.
orgMap !=
null)
803 map.charas = orgMap.
charas;
813 map.
cells[num, num2].
isSeen = array2[num * EClass._map.Size + num2].GetBit(1);
819 Debug.Log(
"Importing New Chara:" +
item.id +
"/" +
item.Name +
"/" +
item.orgPos);
822 bool resetMedal =
GetInt(4) != 0;
827 foreach (Thing thing in orgMap.things)
829 if (t.id == thing.id && t.pos.Equals(thing.pos))
831 if (t.trait is TraitNewZone)
834 map.things.Insert(0, thing);
835 thing.stackOrder = 0;
839 t.ChangeMaterial(thing.material);
849 foreach (Thing thing2 in orgMap.things)
851 if (thing2.trait is TraitNewZone && t.pos.Equals(thing2.pos))
854 map.things.Add(thing2);
860 if (!resetMedal && (t.id ==
"medal" || t.id ==
"856"))
862 foreach (Thing thing3 in orgMap.things)
864 if (t.id == thing3.id && t.pos.Equals(thing3.pos))
894 thing4.isSubsetCard =
false;
914 if (isImported && IsTown)
916 RefreshListCitizen();
919 AddGlobalCharasOnActivate();
923 foreach (
Card item3
in map.
Cards.ToList())
933 idCurrentSubset = forceSubset ?? IDSubset;
934 if (idCurrentSubset !=
null)
942 if (MakeTownProperties)
953 thing7.isNPCProperty =
false;
957 if (instance !=
null)
962 if (isImported && !flag5 && !RevealRoom)
972 point2.cell.isSeen =
false;
981 PathManager.Instance._pathfinder.PunishChangeDirection =
false;
985 EClass._map.config.idSceneProfile =
"indoor_water";
988 if (flag && IsTown && base.lv == 0)
992 if (base.visitCount == 0)
1000 map.effectManager.GetOrCreate(cell.GetSharedPoint());
1019 Map.isDirtySunMap =
true;
1031 card.CalculateFOV();
1035 chara.dirtySpeed =
true;
1040 if (
card.IsUnique && !
card.IsPCFaction && !
card.IsPCParty)
1050 int num3 =
card.GetInt(55);
1055 if (chara2.
uid == num3)
1059 chara.enemy = chara2;
1061 chara.calmCheckTurn = 20 +
EClass.
rnd(30);
1069 if (
card.c_uidMaster != 0 && chara.
master ==
null)
1082 else if (
card.IsInstalled &&
card.trait is
TraitDoor traitDoor &&
card.pos.HasChara && !traitDoor.IsOpen())
1084 traitDoor.ToggleDoor(sound:
false, refresh:
false);
1088 forceRegenerate =
false;
1100 OnVisitNewMapOrRegenerate();
1105 EClass.player.uidLastTown = 0;
1107 else if (IsTown && base.lv == 0)
1109 EClass.player.uidLastTown = base.uid;
1113 RefreshElectricity();
1145 List<Chara> list =
new List<Chara>();
1165 RefreshDeathSentense();
1173 isSimulating =
true;
1178 catch (Exception exception)
1180 Debug.LogException(exception);
1184 isSimulating =
false;
1194 if (HasField(10000))
1214 if (ShouldAutoRevive)
1234 Point point = GetSpawnPos(value);
1251 if (!(
id ==
"startVillage2"))
1257 SetBGM(121, refresh:
false);
1269 Msg.
Say(
"num_silvercat", num.ToString() ??
"");
1301 if (
Boss !=
null && IsNefia)
1307 int num = Mathf.Clamp(MinsSinceLastActive, 1, 10000);
1318 chara2.mana.value = 0;
1322 chara2.stamina.value = 0;
1327 chara2.resistCon =
null;
1331 Msg.ignoreAll =
true;
1333 chara2.
HealHP((
int)((
long)Mathf.Max(1, chara2.
MaxHP) * (
long)Mathf.Min(num, 20) / 20));
1334 chara2.
mana.
Mod(Mathf.Max(1, chara2.
mana.
max) * Mathf.Min(num, 20) / 20);
1336 Msg.ignoreAll =
false;
1340 Debug.Log(
"Last Active:" + base.lastActive);
1341 if (base.lastActive == 0 || IsRegion)
1345 if (pendingSimHours < 0)
1347 pendingSimHours = 0;
1349 int num2 = GetInt(3);
1355 int hourSinceLastActive = HourSinceLastActive;
1356 if (hourSinceLastActive <= 1 && pendingSimHours == 0)
1360 int num3 = hourSinceLastActive + pendingSimHours;
1361 int num4 = ((num2 > 0 && num3 > num2) ? (num3 - num2) : 0);
1363 int num5 = ((EClass.player.simulatingZone && num3 > maxSleepSimHours) ? maxSleepSimHours : num3);
1364 pendingSimHours = num3 - num5;
1365 Debug.Log(
$"{Name} Simulate/{num5}/{pendingSimHours}/skipped {num4}");
1370 int passed = num5 + num4;
1371 int num6 = passed / 24;
1376 if (!
item.IsPCParty)
1378 item.OnSleep(200, num6);
1379 if (
item.conSleep !=
null)
1381 item.conSleep.Kill();
1387 if (
item.things.Count > 20)
1394 VirtualDate.current = virtualDate;
1396 for (
int i = 0; i < num5; i++)
1402 catch (Exception exception)
1406 Debug.LogException(exception);
1414 VirtualDate.current =
null;
1420 foreach (
Chara item2
in list)
1428 if (item2.
id ==
"bee")
1432 if (num6 > 0 && item2.
IsGuest())
1442 item2.
SetAI(goalWork);
1445 (goalWork as
GoalWork).FindWork(item2);
1449 item2.
SetAI(goalWork);
1452 (goalWork as
GoalWork).FindWork(item2);
1462 List<Thing> list2 =
new List<Thing>();
1470 if (num8 >= list2.Count)
1474 for (
int num9 = num8; num9 < list2.Count; num9++)
1479 AddCard(chara, list2.RandomItem().
pos);
1481 chara.c_originalHostility = c_originalHostility;
1487 VirtualDate.current =
null;
1496 bool flag = zone ==
null || zone.lv > base.
lv;
1502 if (GetZoneAt(topZone.
x, topZone.
y) !=
null)
1514 enterState = RegionEnterState;
1520 float rate = zoneTransition?.
ratePos ?? (-1f);
1529 if (nearestPoint !=
null && nearestPoint.
IsValid)
1531 return nearestPoint;
1541 return new Point(zoneTransition.
x, zoneTransition.
z);
1549 if (traitTeleporter !=
null)
1553 if (traitTeleporter !=
null && !zoneTransition.
idTele.IsEmpty() && zoneTransition.
idTele == traitTeleporter.
id.IsEmpty(traitTeleporter.
GetParam(3)))
1567 if (randomThing2 !=
null)
1587 if (randomThing !=
null)
1615 flag = base.lv <= 0;
1641 return new Point(zoneTransition.
x, zoneTransition.
z);
1643 return GetRandomVisitPos(c);
1657 if (thing5.
trait is
TraitNewZone { zone: not null } traitNewZone && zone !=
null && traitNewZone.
zone.
uid == zone.uid)
1661 c.
SetDir(traitNewZone.owner.dir);
1663 return traitNewZone.GetExitPos();
1668 if (thing6.
trait is
TraitNewZone traitNewZone2 && ((flag && traitNewZone2.IsUpstairs) || (!flag && traitNewZone2.IsDownstairs)))
1672 c.
SetDir(traitNewZone2.owner.dir);
1674 return traitNewZone2.GetExitPos();
1677 return GetRandomVisitPos(c);
1685 point = map.
rooms.
listRoom.RandomItem().points.RandomItem();
1687 if (point ==
null &&
EClass.
rnd(4) != 0)
1704 Point spawnPosPC =
null;
1707 spawnPosPC = GetSpawnPos(
EClass.
pc);
1709 if (spawnPosPC ==
null)
1737 c.isRestrained =
false;
1741 Point pos = (c.IsPC ? spawnPosPC : (c.IsPCParty ? spawnPosPC.GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true) : GetSpawnPos(c)));
1746 pos.
Set(spawnPosPC);
1751 if (!spawnPosPC.ForeachNearestPoint(delegate(
Point p)
1759 }, allowBlock:
false, EClass.pc.party.members.Count >= 12, allowInstalled:
true, ignoreCenter:
true, EClass._zone.IsRegion ? 2 : 6))
1761 pos.
Set(spawnPosPC);
1766 c.global.transition =
null;
1774 Point nearestPoint = spawnPosPC.
GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true);
1776 item.pos.Set(nearestPoint);
1785 if (!IsUserZone && !IsPCFaction && map !=
null)
1787 List<Thing> list =
new List<Thing>();
1799 if (
item.IsContainer)
1817 Msg.
Say(
"pick_valuable");
1818 foreach (
Thing item2
in list)
1820 Msg.
Say(
"pick_valuable2", item2);
1827 base.isPeace =
false;
1829 OnBeforeDeactivate();
1841 EClass.game.activeZone =
null;
1845 base.isGenerated =
false;
1847 if (forceRegenerate)
1876 Debug.Log(
"Unloaded Map:" +
this);
1890 base.dateExpire = 0;
1895 thing.isNPCProperty =
false;
1901 for (
int i = 0; i < 7; i++)
1945 SetMainFaction(
null);
1993 Zone topZone = GetTopZone();
2000 if (!base.isRandomSite && !(
this is
Zone_Field) && (topZone ==
null || topZone ==
this || topZone.
FindDeepestZone() ==
this))
2012 if (zone !=
null && zone.
GetTopZone() ==
this)
2024 Debug.Log(
"Deleting Zone:" +
this);
2030 else if (map !=
null)
2032 Debug.Log(
"Saving Zone:" +
this);
2033 map.
Save(base.pathSave);
2034 if (!base.isMapSaved)
2036 base.isMapSaved =
true;
2037 IO.DeleteDirectory(base.pathSave +
"Texture Replace");
2038 IO.CopyDir(pathTemp +
"Texture Replace", base.pathSave +
"/Texture Replace");
2058 children.ForeachReverse(delegate(
Spatial z)
2066 if (parent !=
null && parent.IsRegion && instance ==
null)
2072 base.isGenerated =
false;
2081 base.isGenerated =
false;
2082 Zone topZone = GetTopZone();
2083 if (topZone !=
this)
2088 children.ForeachReverse(delegate(
Spatial c)
2108 if (parent ==
null || parent.IsRegion)
2112 return parent as
Zone;
2118 for (
int i = 0; i < 1000; i++)
2124 return AddCard(t, point);
2127 return AddCard(t, center);
2137 return AddChara(
id, p.
x, p.
z);
2147 return AddThing(
id, p.
x, p.
z);
2152 return AddCard(t, point.
x, point.
z);
2157 return AddCard(t, 0, 0);
2170 chara.currentZone =
this;
2180 ignoreSpawnAnime =
false;
2185 chara.hasSpawned =
true;
2199 t.Chara.currentZone =
null;
2211 public T GetRandomSpot<T>() where T :
Trait
2216 public bool TryAddThingInSpot<T>(
Thing t,
bool useContainer =
true) where T :
Trait
2219 if (randomThing ==
null)
2233 List<Thing> list =
new List<Thing>();
2236 foreach (
Card item2
in item.ListCards())
2240 list.Add(item2.
Thing);
2244 if (TryAddThingInSharedContainer(t, list, add:
true, msg:
false,
null, sharedOnly:
false))
2260 public List<Thing> TryListThingsInSpot<T>(Func<Thing, bool> func =
null) where T :
TraitSpot
2262 List<T> list =
new List<T>();
2263 List<Thing> list2 =
new List<Thing>();
2268 list.Add(thing.
trait as T);
2271 foreach (T
item in list)
2273 foreach (
Point item2
in item.ListPoints(
null, onlyPassable:
false))
2281 if (thing2.
things.Count == 0)
2283 if (IsValid(thing2))
2297 bool IsValid(
Thing t)
2299 if (func !=
null && !func(t))
2309 Thing thing = FindSharedContainer(t, containers, sharedOnly);
2334 if (containers ==
null)
2342 foreach (
Thing container
in containers)
2344 Thing thing = container;
2352 if (windowSaveData !=
null)
2372 foreach (
int cat
in windowSaveData.
cats)
2385 else if (windowSaveData.
flag.HasFlag(flag))
2390 priority = windowSaveData.
priority;
2424 if (num == 0 || !destroyIfFail)
2451 List<T> list =
new List<T>();
2456 list.Add(thing2.
trait as T);
2459 foreach (T
item in list)
2461 foreach (
Point item2
in item.ListPoints(
null, onlyPassable:
false))
2469 if (thing3.
things.Count == 0)
2471 if (IsValid(thing3, insideContainer:
false))
2486 bool IsValid(
Thing t,
bool insideContainer)
2498 string text = IdProfile;
2504 text = ((base.lv < 0) ?
"Underground" :
"Sky");
2506 else if (region !=
null)
2512 name =
Lang.
GetList(
"zone_" + text.Split(
'/')[1]).RandomItem();
2514 for (
int i = 0; i < 3; i++)
2516 for (
int j = 0; j < 3; j++)
2521 if (text ==
"Random/R_Shore")
2523 base.isBeach =
true;
2540 bp.genSetting.seed = base.Seed;
2550 base.isGenerated =
true;
2561 bool flag = IdBiome ==
"Sand" || IdBiome ==
"Water" || IsUnderwater;
2564 int num = 1 +
EClass.
rnd((IdBiome ==
"Water") ? 3 : 2);
2565 for (
int i = 0; i < num; i++)
2570 Thing t =
ThingGen.
Create(
"pearl_oyster",
new string[3] {
"wood_birch",
"poplar",
"coralwood" }.RandomItem(), ContentLv);
2575 for (
int j = 0; j < num; j++)
2586 if (!randomSurface3.
HasObj)
2594 for (
int l = 0; l < 30 +
EClass.
rnd(30); l++)
2617 foreach (
Point point
in r.points)
2621 map.
SetObj(point.
x, point.
z, num7);
2635 foreach (
Point point2
in r.points)
2647 foreach (
Point point3
in r.points)
2654 if (zone_Field !=
null)
2659 for (
int num5 = 0; num5 < num4; num5++)
2682 if (base.Tile.isRoad)
2684 for (
int num6 = 0; num6 <
EClass.
rnd(4); num6++)
2718 for (
int num = 0; num < 3 +
EClass.
rnd(4); num++)
2731 if (r.points.Count <= 4)
2736 List<Point> points = r.points;
2738 "altarPoint".lang(randomReligion.NameDomain.lang());
2743 for (
int i = 0; i < 2 +
EClass.
rnd(2); i++)
2754 if (
item.x % 3 == 0 &&
item.z % 2 == 0 &&
item != points[0] && !
item.Equals(points[0].Front) &&
item.Installed ==
null)
2756 thing = ThingGen.Create(
"pillar1");
2757 EClass._zone.AddCard(thing, item).Install();
2760 item.SetFloor(3, 6);
2768 if (MakeEnemiesNeutral)
2775 chara.hostility = hostility;
2779 if (PrespawnRate != 0f && !IsSkyLevel)
2781 for (
int i = 0; i < (int)((
float)MaxSpawn * PrespawnRate); i++)
2787 TryGenerateBigDaddy();
2788 TryGenerateEvolved();
2789 TryGenerateShrine();
2794 if (OreChance <= 0f)
2801 string text =
"ore";
2802 if (EClass.rnd(5) == 0)
2808 foreach (
Point point in r.points)
2810 if (point.sourceBlock.ContainsTag(
"ore"))
2812 map.SetObj(point.x, point.z, randomMaterial.id, num, 1, 0);
2827 for (
int i = 0; i < 2 +
EClass.
rnd(2); i++)
2844 List<string> list =
new List<string> {
"big_daddy",
"big_daddy2" };
2846 Spawn(list[0], spawnPos);
2849 Spawn(list[1], spawnPos.
GetNearestPoint(allowBlock:
false, allowChara:
false));
2851 Msg.
Say(
"sign_bigdaddy");
2853 void Spawn(
string id,
Point pos)
2855 int num = (int)((
long)DangerLv * 125L / 100);
2879 for (
int i = 0; i < 3; i++)
2887 if (randomSpace ==
null)
2919 chara.c_originalHostility = (
Hostility)0;
2936 for (
int i = 0; i < tries; i++)
2953 List<Point> list2 =
item.ListPoints(
null, onlyPassable:
true, allowChara:
false);
2954 if (list2.Count > 0)
2956 return list2.RandomItem();
2989 if (setting ==
null)
2995 pos = GetSpawnPos(setting.position, setting.tries);
3006 if (IsUnderwater &&
EClass.
rnd(15) != 0)
3011 if (setting.idSpawnList !=
null)
3021 spawnList =
SpawnListChara.
Get(
"dungeon_dragon", (
SourceChara.
Row r) => (r.race ==
"dragon" || r.race ==
"drake" || r.race ==
"wyvern" || r.race ==
"lizardman" || r.race ==
"dinosaur") && r.quality == 0);
3029 spawnList =
SpawnList.
Get(IsInstance ?
"c_neutral_war" :
"c_neutral");
3036 ShouldPass = (
SourceChara.Row s) => (!(s.hostility !=
"") || (!s.tag.Contains(
"cat") && !s.race_row.tag.Contains(
"cat"))) ? true :
false
3045 if (s.hostility !=
"")
3049 return s.biome == biome.name || s.biome.IsEmpty();
3053 int num = ((setting.dangerLv == -1) ? DangerLv : setting.dangerLv);
3057 idEle = setting.idEle
3059 int num2 = ((setting.filterLv == -1) ? num : setting.filterLv);
3062 num2 = ((num - 1) % 50 + 5) * 150 / 100;
3063 if (num2 >= 20 &&
EClass.
rnd(100) < num2)
3074 if (cardRow ==
null)
3076 Debug.LogError(
"SpawnMob: no spawn row list/" + spawnList?.
id +
"/biome/" + biome.name +
"/zone/" + Name);
3079 long num3 = ((setting.fixedLv == -1) ? cardRow.
LV : setting.fixedLv);
3080 bool flag = setting.fixedLv != -1 || setting.addLv > 0 || DangerLvBoost > 0;
3081 num3 += setting.addLv;
3084 num3 = (50L + (long)cardRow.
LV) * Mathf.Max(1, (num - 1) / 50);
3087 num3 += DangerLvBoost;
3088 if (flag && num3 <= Mathf.Max(50, cardRow.
LV))
3092 if (setting.rarity ==
Rarity.Random && cardRow.
quality == 0)
3096 cardBlueprint.rarity =
Rarity.Legendary;
3097 num3 = num3 * 125 / 100;
3102 cardBlueprint.rarity = setting.rarity;
3106 num3 = num3 * 150 / 100;
3108 if (setting.isEvolved)
3110 num3 = num3 * 2 + 20;
3112 if (num3 != cardRow.
LV)
3114 cardBlueprint.lv = (int)Mathf.Min(num3, 100000000f);
3120 chara.isScaled =
false;
3122 AddCard(chara, pos);
3123 if (setting.forcedHostility.HasValue)
3125 Hostility c_originalHostility = (chara.hostility = setting.forcedHostility.Value);
3126 chara.c_originalHostility = c_originalHostility;
3157 if (setting.isEvolved)
3159 chara.c_bossType =
BossType.Evolved;
3161 if (DangerLv >= 20 && !IsPCFaction && !IsTown &&
EClass.
rnd(200) == 0)
3170 return fieldElements.
Has(idEle);
3175 fieldElements.
SetBase(idEle, a, duration);
3180 fieldElements.
Remove(idEle);
3185 dirtyElectricity =
false;
3186 bool flag = GetSoilCost() > MaxSoil;
3187 base.electricity = elements.
Value(2201) * 10 + BaseElectricity;
3201 base.electricity += 20;
3216 bool flag = GetSoilCost() > MaxSoil;
3238 sum += elements.
Value(2201) * 10 + BaseElectricity;
3253 public void SetBGM(List<int> ids,
bool refresh =
true,
float fadeDuration = 0f)
3258 foreach (
int id in ids)
3266 UnityEngine.Object.DestroyImmediate(map.
plDay);
3273 if (fadeDuration > 0f)
3275 EClass.
Sound.StopBGM(fadeDuration, playLastBGM:
false, delegate
3290 public void SetBGM(
int id = -1,
bool refresh =
true,
float fadeDuration = 0f)
3292 SetBGM(
new List<int> {
id }, refresh, fadeDuration);
3297 if (map.
plDay ==
null)
3299 map.plDay = CreatePlaylist(ref map.
_plDay,
EClass.
Sound.GetPlaylist(IDPlayList));
3306 UnityEngine.Object.DestroyImmediate(map.
plDay);
3318 Playlist playlist = map.
plDay;
3321 if (
item.playlist !=
null)
3323 playlist =
item.playlist;
3326 if (IDPlaylistOverwrite !=
null)
3328 playlist =
EClass.
Sound.GetPlaylist(IDPlaylistOverwrite);
3333 if (room !=
null && room.
lot !=
null && room.
lot.
idBGM != 0)
3336 if (playlist.list[0].data?.id != room.
lot.
idBGM)
3353 return ModUtil.CreatePlaylist(ref list, mold);
3374 return GetDeepestLv(ref max);
3379 if (Mathf.Abs(base.lv) > Mathf.Abs(max))
3383 foreach (
Spatial child
in children)
3385 (child as
Zone).GetDeepestLv(ref max);
3392 if (base.source.costSkyTravel > 0)
3394 return base.source.costSkyTravel;
3398 return Mathf.Clamp(10 +
EClass.
curve(DangerLv, 50, 10), 1, 200);
3405 if (landFeats ==
null)
3407 landFeats =
new List<int>();
3409 string[] listBase = IDBaseLandFeat.Split(
',');
3410 string[] array = listBase;
3411 foreach (
string text
in array)
3413 if (!text.IsEmpty())
3418 if (listBase.Length == 1)
3422 if (e.category !=
"landfeat" || e.chance == 0)
3427 string[] tag = e.tag;
3428 foreach (
string text2 in tag)
3430 if (text2.StartsWith(
"bf"))
3433 if (listBase[0] == text2)
3440 return flag ? true :
false;
3443 landFeats.Add(row.
id);
3446 landFeats.Add(row.
id);
3450 List<Element> list2 =
new List<Element>();
3451 foreach (
int landFeat
in landFeats)
3460 ZipFile zipFile = ZipFile.Read(path);
3461 zipFile.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
3462 zipFile.ExtractAll(pathTemp);
3481 IO.CreateTempDirectory();
3486 map.
Save(IO.TempPath +
"/", zoneExportData, partial);
3487 map.
ExportMetaData(IO.TempPath +
"/", Path.GetFileNameWithoutExtension(path), partial);
3488 if (partial ==
null)
3490 IO.CopyDir(base.pathSave +
"Texture Replace", IO.TempPath +
"/Texture Replace");
3492 IO.SaveFile(IO.TempPath +
"/export", zoneExportData, compress:
true);
3493 using (ZipFile zipFile =
new ZipFile())
3495 zipFile.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
3496 zipFile.AddDirectory(IO.TempPath);
3500 IO.DeleteTempDirectory();
3502 catch (Exception ex)
3504 EClass.
ui.Say(ex.Message +
":" + path);
3513 if (!
string.IsNullOrEmpty(text))
3526 if (array.Length != 0)
3528 Zone_User zone_User = SpatialGen.Create(
"user", EClass.world.region, register: true) as Zone_User;
3529 zone_User.path = array[0];
3530 Thing thing = ThingGen.Create(
"teleporter");
3531 thing.c_uidZone = zone_User.uid;
3532 EClass._zone.AddCard(thing, EClass.pc.pos);
3543 catch (Exception ex)
3553 string text = pathExport;
3556 Msg.
Say(
"Exported Map:" + text);
3571 return -10000000 + base.uid;
3575 return -8000000 + base.uid;
3579 return -9000000 + base.uid;
3583 return -7000000 + base.uid;
3587 return 1000000 + base.uid;
3607 AddCard(chara, point);
3608 Msg.
Say(
"guestArrive", chara);
3615 AddCard(chara, point);
3623 if (base.IsPlayerFaction)
3643 foreach (
Thing sucker
in Suckers)
3648 if (RespawnRate != 0f)
3658 if (num < MaxRespawn)
3660 for (
int num2 = 0; num2 < RespawnPerHour; num2++)
3666 if (!date.IsRealTime &&
EClass.
rnd(24) == 0)
3678 if (base.IsPlayerFaction)
3686 if (base.IsPlayerFaction)
3725 HashSet<int> hashSet =
new HashSet<int>();
3732 foreach (
Point item in traitSpotFarm.ListPoints(
null, onlyPassable:
false))
3734 hashSet.Add(
item.index);
3738 EClass.player.isAutoFarming =
false;
3745 void Perform(HashSet<int> farmMap)
3750 if (farmMap !=
null)
3754 if (!farmMap.Contains(c.index))
3759 else if (farmMap.Contains(c.
index))
3773 if (!EClass.player.isAutoFarming && c.growth.HaltGrowth() && (c.IsFarmField || c.IsTopWater) && (!isWinter || !date.IsRealTime))
3778 if (!flag && (plantData ==
null || plantData.fert >= 0))
3784 if (date.sunMap == null)
3794 else if (c.detail !=
null)
3796 c.Things.ForeachReverse(delegate(Thing t)
3798 if (t.IsInstalled && t.trait is TraitSeed && !t.isSale)
3800 (t.trait as TraitSeed).TrySprout(force: false, sucker: false, date);
3804 else if (
EClass.
rnd(20) == 0 && GrowWeed && c.CanGrowWeed &&
EClass.
rnd(weedChance) == 0)
3807 if (c.growth !=
null)
3809 c.growth.SetStage(0);
3813 c.isWatered =
false;
3822 foreach (
Spatial child
in children)
3824 if (!(child is
Zone_Field) && _x == child.
x && _y == child.
y)
3826 return child as
Zone;
3830 foreach (
Spatial child2
in children)
3832 if (_x == child2.
x && _y == child2.
y)
3834 return child2 as
Zone;
3851 bool flag = EClass.player.IsCriminal && HasLaw && !AllowCriminal && !IsPCFaction;
3857 chara.hostility = hostility;
3872 dictCitizen.Clear();
3875 if (
item.trait.IsCitizen && !
item.IsGlobal && !
item.isSubsetCard)
3884 base.isAlarmSet = enable;
3910 base.influence += a;
3913 Msg.
Say(
"gainInfluence", Name, a.ToString() ??
"");
3920 base.development += a;
3923 Msg.
Say(
"gainDevelopment", Name, a.ToString() ??
"");
3929 if (!IsPCFaction && (!(
this is
Zone_Town) || base.lv != 0))
3933 Debug.Log(
"Updating Quest:" + force);
3940 if (
item.quest.IsExpired || completedQuests.Contains(
item.quest.uid) || force)
3958 maxQuest = 4 + EClass.rnd(4);
3960 completedQuests.Clear();
3962 List<Tuple<string, int>> listTag =
new List<Tuple<string, int>>();
3966 array =
new string[9] {
"supply/8",
"deliver/7",
"food/8",
"escort/4",
"deliver/4",
"monster/0",
"war/0",
"farm/0",
"music/0" };
3968 string[] array2 = array;
3969 for (
int num2 = 0; num2 < array2.Length; num2++)
3971 string[] array3 = array2[num2].Split(
'/');
3972 listTag.Add(
new Tuple<string, int>(array3[0], array3[1].ToInt()));
3974 for (
int num3 = 0; num3 < map.charas.Count * 2; num3++)
3992 foreach (Tuple<string, int> item2
in listTag)
3994 if (a.tags.Contains(item2.Item1))
4004 return a.chance * num4;
4016 List<Chara> list =
new List<Chara>();
4052 for (
int i = 0; i < 2 +
EClass.
rnd(4); i++)
4054 Point point = GetPos();
4062 thing.isLostProperty =
true;
4064 int num = (thing.c_lockLv =
EClass.
rndHalf(Mathf.Min(base.development / 10 + 10, 50)));
4081 static Point GetPos()
4083 for (
int j = 0; j < 10; j++)
4097 bool flag =
this is
Zone_Yowyn && base.lv == -1;
4104 if (EClass.player.doneBackers.Contains(a.id))
4122 if (chara.
id !=
"follower")
4133 if (
item.chara == chara.
id)
4145 if (fortuneRoll ==
null)
4150 if (refresh || fortuneRoll.
count == 0)
virtual void OnSimulatePosition()
void SimulateZone(int days)
void Add(Act a, string s="")
virtual bool IsHostileAct
BaseArea.AccessType accessType
void WaitForEndOfFrame(Action action)
List< SpawnListChara > chara
string GetRandomCharaId()
void Populate(Point point, bool interior=false, float mtpDensity=1f)
static void Set(CardBlueprint _bp=null)
GlobalCharaList globalCharas
List< Chara > ListGlobalChara(Zone z)
override void OnLeaveScreen()
virtual void OnSimulateHour(VirtualDate date)
void SetPlaceState(PlaceState newState, bool byPlayer=false)
SourceBacker.Row sourceBacker
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Thing AddThing(string id, int lv=-1)
void AddEditorTag(EditorTag tag)
void DecayNatural(int hour=1)
virtual void HealHP(long a, HealSource origin=HealSource.None)
Window.SaveData GetWindowSaveData()
bool HasEditorTag(EditorTag tag)
bool TryStackTo(Thing to)
void ApplyBacker(int bid)
Thing Add(string id, int num=1, int lv=1)
SourceCategory.Row category
bool HasElement(int ele, bool includeNagative=false)
void Say(string lang, string ref1=null, string ref2=null)
static Chara CreateFromFilter(string id, int lv=-1, int levelRange=-1)
static Chara Create(string id, int lv=-1)
BaseCondition GetCondition(string idCon)
Hostility OriginalHostility
Condition AddCondition(string id, int p=100, bool force=false)
bool HasCondition(string alias)
override bool IsPCFaction
void TryRestock(bool onCreate)
void Revive(Point p=null, bool msg=false)
Thing MakeGene(DNA.Type? type=null)
override void SetDir(int d)
Chara SetEnemy(Chara c=null)
void Cure(CureType type, int p=100, BlessedState state=BlessedState.Normal)
Chara SetHostility(Hostility h)
void MoveZone(string alias)
bool ignoreBackerDestoryFlag
Dictionary< int, BGMData > dictBGM
static Crawler Create(string id)
bool CrawlUntil(Map map, Func< Point > onStart, int tries, Func< Result, bool > canComplete, Action onFail=null)
int GetElapsedHour(int rawDate)
int GetRaw(int offsetHours=0)
int GetElapsedMins(int rawDate)
int GetRemainingHours(int rawDeadLine)
static int curve(long _a, int start, int step, int rate=75)
static SourceManager sources
static float rndf(float a)
static FactionBranch Branch
static int rndHalf(int a)
static SoundManager Sound
static GameSetting setting
static Effect Get(Effect original)
void Play(float delay, Point from, float fixY=0f, Point to=null, Sprite sprite=null)
Element SetBase(string alias, int v, int potential=0)
static Element Create(int id, int v=0)
void Initialize(EloMap _elomap)
void SetZone(int gx, int gy, Zone z, bool updateMesh=false)
TileInfo GetTileInfo(int gx, int gy)
void OnSimulateMonth(VirtualDate date)
void OnSimulateDay(VirtualDate date)
void OnSimulateHour(VirtualDate date)
string Log(string idLang, string ref1=null, string ref2=null, string ref3=null, string ref4=null)
ElementContainerZone elements
List< GodStatueData > godStatues
ReligionManager religions
ZoneTransition transition
void SetStage(int idx, bool renewHarvest=false)
virtual bool NeedSunlight
bool CanGrow(VirtualDate date)
void RefreshDevelopment()
static Guild GetCurrentGuild()
static string[] GetList(string id)
static SourceMaterial.Row GetRandomMaterial(int lv, string group=null, bool tryLevelMatTier=false)
Point GetLeftPos(float rate=-1f)
void ForeachCell(Action< Cell > action)
Point GetBottomPos(float rate=-1f)
Point GetRandomSurface(int x, int z, int radius, bool walkable=true, bool allowWater=false)
Point GetTopPos(float rate=-1f)
Point GetRandomSpace(int width, int height, int tries=100)
Point GetRightPos(float rate=-1f)
static MapSubset Load(string id)
new void ForeachCell(Action< Cell > action)
PlantData TryGetPlant(Point p)
void ExportMetaData(string _path, string id, PartialMap partial=null)
Chara FindChara(string id)
IEnumerable< Card > Cards
Point GetRandomPoint(Point center, int radius, int tries=100, bool mustBeWalkable=true, bool requireLos=true)
void Save(string path, ZoneExportData export=null, PartialMap partial=null)
void AddCardOnActivate(Card c)
void OnCardRemovedFromZone(Card t)
byte[] TryLoadFile(string path, string s, int size)
Dictionary< int, int > backerObjs
void SetFloor(int x, int z, int idMat=0, int idFloor=0)
PlantData AddPlant(Point pos, Thing seed)
void OnImport(ZoneExportData data)
List< Chara > serializedCharas
static MapMetaData GetMetaData(string pathZip)
void OnCardAddedToZone(Card t, int x, int z)
void Load(string path, bool import=false, PartialMap partial=null)
void RevealAll(bool reveal=true)
void SetObj(int x, int z, int id=0, int value=1, int dir=0)
static string SayRaw(string text)
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Cell GetCenterCell(int radius=1)
void OccyupyPOI(Point p, int radius=0)
static PathManager Instance
bool IsPathClear(Point origin, Point dest, IPathfindWalker walker, int radius)
List< Chara > listCarryoverMap
HashSet< int > doneBackers
void SetObj(int id=0, int value=1, int dir=0)
override string ToString()
Point Set(int _x, int _z)
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false, int minRadius=0)
bool Equals(int _x, int _z)
Point GetRandomPointInRadius(int minRadius, int maxRadius, bool requireLos=true, bool allowChara=true, bool allowBlocked=false, int tries=2000)
Point Clamp(bool useBounds=false)
Thing FindThing(Func< Thing, bool > func)
Point GetRandomPoint(int radius, bool requireLos=true, bool allowChara=true, bool allowBlocked=false, int tries=100)
bool IsActive(int id, int days=-1)
static List< Zone > ListDeliver()
static Quest Create(string _id, string _idPerson=null, Chara c=null, bool assignQuest=true)
static int Range(int min, int max)
static void InitBytes(int a)
static void UseSeed(int seed, Action action)
static void SetSeed(int a=-1)
Dictionary< string, Religion > dictAll
Religion GetRandomReligion(bool onlyJoinable=true, bool includeMinor=false)
static string[] OpenFilePanel(string title, string directory, string extension, bool multiselect)
static string SaveFilePanel(string title, string directory, string defaultName, string extension)
static SceneProfile Load(string id)
void RemoveActorEx(Card c)
Dictionary< string, CardRow > map
SourceZoneAffix zoneAffixes
static Spatial Create(string id, Spatial parent, bool register, int x=-99999, int y=-99999, int icon=0)
void SetInt(int id, int value=0)
virtual int DangerLvBoost
int GetInt(int id, int? defaultInt=null)
static SpawnList Get(string id, Func< SourceChara.Row, bool > func)
static SpawnList Get(string id, string parent=null, CardFilter filter=null)
static SpawnSetting Default
static SpawnSetting Fish()
static SpawnSetting HomeGuest(int lv)
static SpawnSetting Evolved(int fixedLv=-1)
void ApplyLocalReplace(string path)
List< Thing > List(Func< Thing, bool > func, bool onlyAccessible=false)
void DestroyAll(Func< Thing, bool > funcExclude=null)
Thing CanStack(Thing target, int destInvX=-1, int destInvY=-1)
static Thing CreateFromCategory(string idCat, int lv=-1)
static Thing Create(string id, int idMat=-1, int lv=-1)
override string GetName(NameStyle style, int _num=-1)
virtual bool CanGiveRandomQuest
virtual bool CanAutoRevive
TraitSet GetTraitSet(Type t)
virtual bool IsFor(Zone z)
static bool CanTagSale(Card t, bool insideContainer=false)
static Thing MakeSeed(string idSource)
static void LevelSeed(Thing t, SourceObj.Row obj, int num)
Point GetRandomPoint(Func< Point, bool > func=null, Chara accessChara=null)
virtual ShopType ShopType
string GetParam(int i, string def=null)
virtual List< Point > ListPoints(Point center=null, bool onlyPassable=true, bool allowChara=true)
static void Reserve(string idStep, Action onBeforePlay=null)
FilterResult IsFilterPass(string text)
void GenerateMap(Zone zone)
EloMap.TileInfo[,] surrounding
List< ZonePreEnterEvent > listPreEnter
virtual void OnGenerateMap()
virtual bool ShowEnemyOnMinimap
static ZoneProfile Load(string id)
virtual string GetNewZoneID(int level)
void OnChildNumChange(Card c)
virtual bool CanDigUnderground
virtual int BaseElectricity
virtual string IDPlayList
Dictionary< int, string > dictCitizen
override string ToString()
List< Chara > ListMinions(Chara c)
void RefreshElectricity()
ZoneExportData Import(string path)
virtual string IDBaseLandFeat
static string string int zoneLv ParseZoneFullName(string zoneFullName)
virtual string GetDungenID()
virtual bool BlockBorderExit
void RefreshDeathSentense()
static string forceSubset
virtual float PrespawnRate
FortuneRollData GetOrCreateFortuneRollData(bool refresh=true)
virtual bool RegenerateOnEnter
virtual void OnAfterSimulate()
void OnSimulateDay(VirtualDate date)
Playlist CreatePlaylist(ref List< int > list, Playlist mold=null)
static bool IsImportValid(string path)
virtual string IDGenerator
int CountMinions(Chara c)
virtual bool MakeTownProperties
Thing TryGetThingFromSharedContainer(Func< Thing, bool > func)
void WriteNote(UINote n, Action< UINote > onWriteNote=null, IInspect.NoteMode mode=IInspect.NoteMode.Default, Recipe recipe=null)
virtual void OnRegenerate()
virtual bool CountDeepestLevel
virtual ZoneScaleType ScaleType
virtual bool SetAlarmOnBreakLaw
virtual string pathExport
virtual void OnBeforeDeactivate()
virtual ZoneTransition.EnterState RegionEnterState
virtual bool ShouldAutoRevive
HashSet< int > completedQuests
virtual bool DisableRooms
Chara TryGenerateEvolved(bool force=false, Point p=null)
void ImportDialog(string dir=null)
void ClaimZone(bool debug=false, Point pos=null)
Chara AddChara(string id, int x, int z)
Card AddThing(string id, int x, int z)
ElementContainerField fieldElements
virtual bool ShouldScaleImportedChara(Chara c)
ElementContainerZone elements
virtual bool IsReturnLocation
Chara AddRandomVisitor(bool guest=false)
void ExportDialog(string dir=null)
virtual void OnBeforeSimulate()
int GetElectricity(bool cost=false)
virtual FlockController.SpawnType FlockType
Chara SpawnMob(Point pos=null, SpawnSetting setting=null)
virtual bool CanUnlockExit
int GetDeepestLv(ref int max)
virtual int RespawnPerHour
virtual float RespawnRate
Chara FindDeadChara(string id)
void ApplyBackerPet(bool draw)
bool CanEnterBuildModeAnywhere
Card AddCardSplinkle(Card t, Point center, int radius=4)
void SetBGM(List< int > ids, bool refresh=true, float fadeDuration=0f)
override string NameSuffix
virtual string TextWidgetDate
void AddGlobalCharasOnActivate()
void OnSimulateMonth(VirtualDate date)
Thing FindSharedContainer(Thing t, List< Thing > containers=null, bool sharedOnly=true)
virtual float ChanceSpawnNeutral
virtual string IDSceneTemplate
virtual int SightRadiusBonus
virtual bool CanBeDeliverDestination
void ClearZones(Zone current=null)
bool TryAddThingInSharedContainer(Thing t, List< Thing > containers=null, bool add=true, bool msg=false, Chara chara=null, bool sharedOnly=true)
virtual void OnDeactivate()
virtual ActionMode DefaultActionMode
virtual void OnActivate()
Card AddCard(Card t, int x, int z)
void OnSimulateHour(VirtualDate date)
override void _OnBeforeSave()
override void OnAfterCreate()
static List< Thing > Suckers
Card AddThing(string id, Point p)
Zone FindOrCreateLevel(int destLv, string subId="")
virtual string IDAmbience
Chara SpawnMob(string id, Point pos=null)
virtual string IDPlaylistOverwrite
Point GetSpawnPos(SpawnPosition type, int tries=100)
bool TryAddThing(Thing target, Point p, bool destroyIfFail=false)
void GrowPlants(VirtualDate date)
Chara FindChara(string id)
void SetBGM(int id=-1, bool refresh=true, float fadeDuration=0f)
virtual bool ShouldMakeExit
virtual bool AllowCriminal
virtual bool AlwaysLowblock
virtual bool AllowNewZone
virtual bool RestrictBuild
virtual void OnGenerateRooms(BaseMapGen gen)
Point GetRandomVisitPos(Chara c)
virtual void OnGenerateMap()
static string string zoneId
List< Element > ListLandFeats()
static bool forceRegenerate
virtual bool MakeEnemiesNeutral
virtual bool IsUnderwater
virtual void OnCreateBP()
void Export(string path, PartialMap partial=null, bool usermap=false)
virtual bool ShouldRegenerate
void RemoveFieldEffect(int idEle)
virtual float BigDaddyChance
void TryGenerateBigDaddy()
virtual float EvolvedChance
static bool ignoreSpawnAnime
virtual void SetAlarm(bool enable)
virtual void OnAdvanceHour()
FortuneRollData fortuneRoll
void ModDevelopment(int a)
virtual bool WillAutoSave
virtual bool IsExplorable
void UpdateQuests(bool force=false)
virtual bool KeepAllyDistance
virtual bool HiddenInRegionMap
bool IsCrime(Chara c, Act act)
void RefreshListCitizen()
Zone GetZoneAt(int _x, int _y)
Card AddCard(Card t, Point point)
string TextLevel(int _lv)
void SetFieldEffect(int idEle, int a, int duration=0)
Chara AddChara(string id, Point p)
virtual ZoneFeatureType FeatureType
virtual float ShrineChance
Point GetSpawnPos(Chara c, ZoneTransition.EnterState destState=ZoneTransition.EnterState.Auto)
virtual void OnVisitNewMapOrRegenerate()
bool IsBelow(int _major, int _minor, int _batch)