2using System.Collections.Generic;
52 public Dictionary<int, string>
dictCitizen =
new Dictionary<int, string>();
83 public static List<Thing>
Suckers =
new List<Thing>();
95 base.uidBoss = value?.
uid ?? 0;
145 public virtual string IDPlayList => base.source.idPlaylist.IsEmpty((base.lv != 0) ?
"Underground" :
null);
149 public virtual string IDHat =>
null;
157 if (base.source.idFile.Length != 0)
159 return base.source.idFile[
fileVariation] + ((base.lv == 0) ?
"" : (
"_F" + base.lv));
165 public string pathTemp => GameIO.pathTemp + base.uid +
"/";
283 public virtual int MaxLv => 99999999;
285 public virtual int MinLv => -99999999;
317 public virtual int MaxSpawn => map.bounds.Width * map.bounds.Height / 175 + 2;
363 return base.source.tag.Contains(
"return");
375 return base.lv <
MaxLv;
395 public virtual bool UseFog => base.lv < 0;
407 return base.source.tag.Contains(
"light");
419 public virtual FlockController.SpawnType
FlockType => FlockController.SpawnType.Default;
429 return "conquered".lang();
533 if (destLv == base.lv)
555 zoneFullName = zoneFullName.Replace(
'/',
'@');
556 int num = zoneFullName.LastIndexOf(
'@');
558 if (num > 0 && num < zoneFullName.Length - 1)
560 text = zoneFullName[..num];
561 item = zoneFullName[(num + 1)..].ToInt();
565 text = zoneFullName.Replace(
"@",
"");
567 string text2 = text.Replace(
"Zone_",
"");
568 text =
"Zone_" + text2;
594 return base.source.id;
608 return " " +
"zoneLevelB".lang((_lv * -1).
ToString() ??
"");
610 return " " +
"zoneLevel".lang((_lv + 1).
ToString() ??
"");
644 EClass.game.config.reverseSnow =
false;
651 EClass.pc.global.transition.uidLastZone = 0;
659 EClass.game.activeZone =
this;
661 Debug.Log(
NameWithLevel +
"/" +
id +
"/" + base.uid +
"/" + base.isGenerated +
"/" +
IsLoaded +
"/" + File.Exists(base.pathSave +
"map"));
662 if (base.isGenerated && !
IsLoaded && !File.Exists(base.pathSave +
"map"))
664 Debug.Log(
"(Bug) File does not exist:" +
destryoed +
"/" + base.pathSave);
665 base.isGenerated =
false;
670 if (flag2 &&
map !=
null)
675 string lhs = CorePath.ZoneSave +
"_new.z";
676 bool flag3 = File.Exists(fullName) && !PathComparer.Default.Equals(lhs, fullName);
679 if (!flag3 && (base.source.tag.Contains(
"addMap") || flag4))
681 string[] array =
new string[4]
688 for (
int i = 0; i < array.Length; i++)
690 FileInfo fileInfo = PackageIterator.GetFiles(array[i]).LastOrDefault();
691 if (fileInfo !=
null)
693 fullName = fileInfo.FullName;
700 if (!base.isGenerated && (!flag4 || !flag3))
702 Debug.Log(
"generating random map");
725 Debug.Log(
"zone is already loaded");
739 Debug.Log(base.isGenerated +
"/" + flag5 +
"/" + flag2 +
"/" +
IDSubset);
740 if (!base.isGenerated || flag5 || flag2)
742 Debug.Log(
"importing map:" + fullName);
747 IO.DeleteDirectory(
pathTemp +
"Texture Replace");
752 zoneExportData =
Import(fullName);
753 base.isGenerated =
true;
757 zoneExportData.orgMap =
GameIO.LoadFile<
Map>(base.pathSave +
"map");
760 catch (Exception message)
764 base.isGenerated =
true;
769 Debug.Log(
"loading map: imported? " +
isImported +
" regenerate? " + flag5);
775 catch (Exception message2)
777 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);
778 Debug.LogError(message2);
796 if (zoneExportData.
orgMap !=
null)
800 map.charas = orgMap.
charas;
810 map.
cells[j, k].
isSeen = array2[j * EClass._map.Size + k].GetBit(1);
816 Debug.Log(
"Importing New Chara:" +
item.id +
"/" +
item.Name +
"/" +
item.orgPos);
831 thing.stackOrder = 0;
856 if (t.
id ==
"medal" || t.
id ==
"856")
889 thing4.isSubsetCard =
false;
948 thing7.isNPCProperty =
false;
967 point2.cell.isSeen =
false;
976 PathManager.Instance._pathfinder.PunishChangeDirection =
false;
980 EClass._map.config.idSceneProfile =
"indoor_water";
983 if (flag &&
IsTown && base.lv == 0)
987 if (base.visitCount == 0)
995 map.effectManager.GetOrCreate(c.GetSharedPoint());
1014 Map.isDirtySunMap =
true;
1026 card.CalculateFOV();
1030 chara.dirtySpeed =
true;
1035 if (
card.IsUnique && !
card.IsPCFaction && !
card.IsPCParty)
1045 int @
int =
card.GetInt(55);
1050 if (chara2.
uid == @
int)
1054 chara.enemy = chara2;
1056 chara.calmCheckTurn = 20 +
EClass.
rnd(30);
1064 if (
card.c_uidMaster != 0 && chara.
master ==
null)
1077 else if (
card.IsInstalled &&
card.trait is
TraitDoor traitDoor &&
card.pos.HasChara && !traitDoor.IsOpen())
1079 traitDoor.ToggleDoor(sound:
false, refresh:
false);
1100 EClass.player.uidLastTown = 0;
1102 else if (
IsTown && base.lv == 0)
1104 EClass.player.uidLastTown = base.uid;
1140 List<Chara> list =
new List<Chara>();
1239 if (!(
id ==
"startVillage2"))
1245 SetBGM(121, refresh:
false);
1257 Msg.
Say(
"num_silvercat", num.ToString() ??
"");
1306 chara2.mana.value = 0;
1310 chara2.stamina.value = 0;
1315 chara2.resistCon =
null;
1319 Msg.ignoreAll =
true;
1321 chara2.
HealHP((
int)((
long)Mathf.Max(1, chara2.
MaxHP) * (
long)Mathf.Min(num, 20) / 20));
1322 chara2.
mana.
Mod(Mathf.Max(1, chara2.
mana.
max) * Mathf.Min(num, 20) / 20);
1324 Msg.ignoreAll =
false;
1328 Debug.Log(
"Last Active:" + base.lastActive);
1342 if (!
item.IsPCParty)
1344 item.OnSleep(200, num2);
1345 if (
item.conSleep !=
null)
1347 item.conSleep.Kill();
1353 if (
item.things.Count > 20)
1360 VirtualDate.current = virtualDate;
1373 VirtualDate.current =
null;
1379 foreach (
Chara item2
in list)
1387 if (item2.
id ==
"bee")
1391 if (num2 > 0 && item2.
IsGuest())
1401 item2.
SetAI(goalWork);
1404 (goalWork as
GoalWork).FindWork(item2);
1408 item2.
SetAI(goalWork);
1411 (goalWork as
GoalWork).FindWork(item2);
1421 List<Thing> list2 =
new List<Thing>();
1429 if (num4 >= list2.Count)
1433 for (
int j = num4; j < list2.Count; j++)
1440 chara.c_originalHostility = c_originalHostility;
1450 bool flag = zone ==
null || zone.lv > base.
lv;
1474 float rate = zoneTransition?.
ratePos ?? (-1f);
1483 if (nearestPoint !=
null && nearestPoint.
IsValid)
1485 return nearestPoint;
1495 return new Point(zoneTransition.
x, zoneTransition.
z);
1503 if (traitTeleporter !=
null)
1507 if (traitTeleporter !=
null && !zoneTransition.
idTele.IsEmpty() && zoneTransition.
idTele == traitTeleporter.
id.IsEmpty(traitTeleporter.
GetParam(3)))
1521 if (randomThing2 !=
null)
1541 if (randomThing !=
null)
1561 flag = base.lv <= 0;
1587 return new Point(zoneTransition.
x, zoneTransition.
z);
1603 if (thing5.
trait is
TraitNewZone { zone: not null } traitNewZone && zone !=
null && traitNewZone.
zone.
uid == zone.uid)
1605 if (c !=
null && enterState != 0)
1607 c.SetDir(traitNewZone.owner.dir);
1609 return traitNewZone.GetExitPos();
1614 if (thing6.
trait is
TraitNewZone traitNewZone2 && ((flag && traitNewZone2.IsUpstairs) || (!flag && traitNewZone2.IsDownstairs)))
1616 if (c !=
null && enterState != 0)
1618 c.SetDir(traitNewZone2.owner.dir);
1620 return traitNewZone2.GetExitPos();
1633 if (point ==
null &&
EClass.
rnd(4) != 0)
1650 Point spawnPosPC =
null;
1655 if (spawnPosPC ==
null)
1683 c.isRestrained =
false;
1687 Point pos = (c.IsPC ? spawnPosPC : (c.IsPCParty ? spawnPosPC.GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true) :
GetSpawnPos(c)));
1692 pos.
Set(spawnPosPC);
1697 if (!spawnPosPC.ForeachNearestPoint(delegate(
Point p)
1705 }, allowBlock:
false, EClass.pc.party.members.Count >= 12, allowInstalled:
true, ignoreCenter:
true, EClass._zone.IsRegion ? 2 : 6))
1707 pos.
Set(spawnPosPC);
1712 c.global.transition =
null;
1720 Point nearestPoint = spawnPosPC.
GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true);
1722 item.pos.Set(nearestPoint);
1733 List<Thing> list =
new List<Thing>();
1745 if (
item.IsContainer)
1763 Msg.
Say(
"pick_valuable");
1764 foreach (
Thing item2
in list)
1766 Msg.
Say(
"pick_valuable2", item2);
1773 base.isPeace =
false;
1787 EClass.game.activeZone =
null;
1791 base.isGenerated =
false;
1822 Debug.Log(
"Unloaded Map:" +
this);
1836 base.dateExpire = 0;
1841 thing.isNPCProperty =
false;
1847 for (
int i = 0; i < 7; i++)
1940 if (!base.isRandomSite && !(
this is
Zone_Field) && (topZone ==
null || topZone ==
this || topZone.
FindDeepestZone() ==
this))
1952 if (zone !=
null && zone.
GetTopZone() ==
this)
1964 Debug.Log(
"Deleting Zone:" +
this);
1970 else if (
map !=
null)
1972 Debug.Log(
"Saving Zone:" +
this);
1974 if (!base.isMapSaved)
1976 base.isMapSaved =
true;
1977 IO.DeleteDirectory(base.pathSave +
"Texture Replace");
1978 IO.CopyDir(
pathTemp +
"Texture Replace", base.pathSave +
"/Texture Replace");
2012 base.isGenerated =
false;
2021 base.isGenerated =
false;
2023 if (topZone !=
this)
2058 for (
int i = 0; i < 1000; i++)
2110 chara.currentZone =
this;
2125 chara.hasSpawned =
true;
2139 t.Chara.currentZone =
null;
2159 if (randomThing ==
null)
2166 List<Thing> list =
new List<Thing>();
2169 foreach (
Card item2
in item.ListCards())
2173 list.Add(item2.
Thing);
2188 List<T> list =
new List<T>();
2189 List<Thing> list2 =
new List<Thing>();
2194 list.Add(thing.
trait as T);
2197 foreach (T
item in list)
2199 foreach (
Point item2
in item.ListPoints(
null, onlyPassable:
false))
2207 if (thing2.
things.Count == 0)
2209 if (IsValid(thing2))
2223 bool IsValid(
Thing t)
2225 if (func !=
null && !func(t))
2242 if (containers ==
null)
2246 if (SearchDest() !=
null)
2265 foreach (
Thing container
in containers)
2267 Thing thing = container;
2275 if (windowSaveData !=
null)
2295 foreach (
int cat
in windowSaveData.
cats)
2308 else if (windowSaveData.
flag.HasFlag(flag))
2313 priority = windowSaveData.
priority;
2347 if (num == 0 || !destroyIfFail)
2374 List<T> list =
new List<T>();
2379 list.Add(thing2.
trait as T);
2382 foreach (T
item in list)
2384 foreach (
Point item2
in item.ListPoints(
null, onlyPassable:
false))
2392 if (thing3.
things.Count == 0)
2394 if (IsValid(thing3, insideContainer:
false))
2409 bool IsValid(
Thing t,
bool insideContainer)
2427 text = ((base.lv < 0) ?
"Underground" :
"Sky");
2429 else if (region !=
null)
2437 for (
int i = 0; i < 3; i++)
2439 for (
int j = 0; j < 3; j++)
2444 if (text ==
"Random/R_Shore")
2446 base.isBeach =
true;
2463 bp.genSetting.seed = base.Seed;
2473 base.isGenerated =
true;
2488 for (
int i = 0; i < num; i++)
2498 for (
int j = 0; j < num; j++)
2509 if (!randomSurface3.
HasObj)
2517 for (
int l = 0; l < 30 +
EClass.
rnd(30); l++)
2540 foreach (
Point point
in r.points)
2558 foreach (
Point point2
in r.points)
2570 foreach (
Point point3
in r.points)
2577 if (zone_Field !=
null)
2582 for (
int m = 0; m < num4; m++)
2605 if (base.Tile.isRoad)
2641 for (
int i = 0; i < 3 +
EClass.
rnd(4); i++)
2654 if (r.points.Count <= 4)
2659 List<Point> points = r.points;
2661 "altarPoint".lang(randomReligion.NameDomain.lang());
2666 for (
int i = 0; i < 2 +
EClass.
rnd(2); i++)
2677 if (
item.x % 3 == 0 &&
item.z % 2 == 0 &&
item != points[0] && !
item.Equals(points[0].Front) &&
item.Installed ==
null)
2679 thing = ThingGen.Create(
"pillar1");
2680 EClass._zone.AddCard(thing, item).Install();
2683 item.SetFloor(3, 6);
2691 if (MakeEnemiesNeutral)
2698 chara.hostility = hostility2;
2702 if (PrespawnRate != 0f && !IsSkyLevel)
2704 for (
int i = 0; i < (int)((
float)MaxSpawn * PrespawnRate); i++)
2710 TryGenerateBigDaddy();
2711 TryGenerateEvolved();
2712 TryGenerateShrine();
2717 if (OreChance <= 0f)
2724 string group =
"ore";
2725 if (EClass.rnd(5) == 0)
2731 foreach (
Point point in r.points)
2733 if (point.sourceBlock.ContainsTag(
"ore"))
2735 map.SetObj(point.x, point.z, randomMaterial.id, b, 1, 0);
2750 for (
int i = 0; i < 2 +
EClass.
rnd(2); i++)
2767 List<string> list =
new List<string> {
"big_daddy",
"big_daddy2" };
2769 Spawn(list[0], spawnPos);
2772 Spawn(list[1], spawnPos.
GetNearestPoint(allowBlock:
false, allowChara:
false));
2774 Msg.
Say(
"sign_bigdaddy");
2776 void Spawn(
string id,
Point pos)
2778 int num = (int)((
long)DangerLv * 125L / 100);
2802 for (
int i = 0; i < 3; i++)
2810 if (randomSpace ==
null)
2842 chara.c_originalHostility = (
Hostility)0;
2859 for (
int i = 0; i < tries; i++)
2876 List<Point> list2 =
item.ListPoints(
null, onlyPassable:
true, allowChara:
false);
2877 if (list2.Count > 0)
2879 return list2.RandomItem();
2912 if (setting ==
null)
2918 pos = GetSpawnPos(setting.position, setting.tries);
2929 if (IsUnderwater &&
EClass.
rnd(15) != 0)
2934 if (setting.idSpawnList !=
null)
2944 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);
2952 spawnList =
SpawnList.
Get(IsInstance ?
"c_neutral_war" :
"c_neutral");
2959 ShouldPass = (
SourceChara.Row s) => (!(s.hostility !=
"") || (!s.tag.Contains(
"cat") && !s.race_row.tag.Contains(
"cat"))) ? true :
false
2968 if (s.hostility !=
"")
2972 return s.biome == biome.name || s.biome.IsEmpty();
2976 int num = ((setting.dangerLv == -1) ? DangerLv : setting.dangerLv);
2980 idEle = setting.idEle
2982 int num2 = ((setting.filterLv == -1) ? num : setting.filterLv);
2985 num2 = ((num - 1) % 50 + 5) * 150 / 100;
2986 if (num2 >= 20 &&
EClass.
rnd(100) < num2)
2997 long num3 = ((setting.fixedLv == -1) ? cardRow.
LV : setting.fixedLv);
2998 bool flag = setting.fixedLv != -1 || DangerLvBoost > 0;
2999 num3 += setting.addLv;
3002 num3 = (50L + (long)cardRow.
LV) * Mathf.Max(1, (num - 1) / 50);
3005 num3 += DangerLvBoost;
3006 if (setting.rarity ==
Rarity.Random && cardRow.
quality == 0)
3010 cardBlueprint.rarity =
Rarity.Legendary;
3011 num3 = num3 * 125 / 100;
3016 cardBlueprint.rarity = setting.rarity;
3020 num3 = num3 * 150 / 100;
3022 if (setting.isEvolved)
3024 num3 = num3 * 2 + 20;
3026 if (num3 != cardRow.
LV)
3028 cardBlueprint.lv = (int)Mathf.Min(num3, 100000000f);
3034 chara.isScaled =
false;
3036 AddCard(chara, pos);
3037 if (setting.forcedHostility.HasValue)
3039 Hostility c_originalHostility = (chara.hostility = setting.forcedHostility.Value);
3040 chara.c_originalHostility = c_originalHostility;
3071 if (setting.isEvolved)
3073 chara.c_bossType =
BossType.Evolved;
3075 if (DangerLv >= 20 && !IsPCFaction && !IsTown &&
EClass.
rnd(200) == 0)
3084 return fieldElements.
Has(idEle);
3089 fieldElements.
SetBase(idEle, a, duration);
3094 fieldElements.
Remove(idEle);
3099 dirtyElectricity =
false;
3100 bool flag = GetSoilCost() > MaxSoil;
3101 base.electricity = elements.
Value(2201) * 10 + BaseElectricity;
3115 base.electricity += 20;
3130 bool flag = GetSoilCost() > MaxSoil;
3152 sum += elements.
Value(2201) * 10 + BaseElectricity;
3167 public void SetBGM(List<int> ids,
bool refresh =
true,
float fadeDuration = 0f)
3172 foreach (
int id in ids)
3180 UnityEngine.Object.DestroyImmediate(map.
plDay);
3187 if (fadeDuration > 0f)
3189 EClass.
Sound.StopBGM(fadeDuration, playLastBGM:
false, delegate
3204 public void SetBGM(
int id = -1,
bool refresh =
true,
float fadeDuration = 0f)
3206 SetBGM(
new List<int> {
id }, refresh, fadeDuration);
3211 if (map.
plDay ==
null)
3213 map.plDay = CreatePlaylist(ref map.
_plDay,
EClass.
Sound.GetPlaylist(IDPlayList));
3220 UnityEngine.Object.DestroyImmediate(map.
plDay);
3232 Playlist playlist = map.
plDay;
3235 if (
item.playlist !=
null)
3237 playlist =
item.playlist;
3240 if (IDPlaylistOverwrite !=
null)
3242 playlist =
EClass.
Sound.GetPlaylist(IDPlaylistOverwrite);
3247 if (room !=
null && room.
lot !=
null && room.
lot.
idBGM != 0)
3250 if (playlist.list[0].data?.id != room.
lot.
idBGM)
3267 return ModUtil.CreatePlaylist(ref list, mold);
3288 return GetDeepestLv(ref max);
3293 if (Mathf.Abs(base.lv) > Mathf.Abs(max))
3297 foreach (
Spatial child
in children)
3299 (child as
Zone).GetDeepestLv(ref max);
3306 if (landFeats ==
null)
3308 landFeats =
new List<int>();
3310 string[] listBase = IDBaseLandFeat.Split(
',');
3311 string[] array = listBase;
3312 foreach (
string text
in array)
3314 if (!text.IsEmpty())
3319 if (listBase.Length == 1)
3323 if (e.category !=
"landfeat" || e.chance == 0)
3328 string[] tag = e.tag;
3329 foreach (
string text2 in tag)
3331 if (text2.StartsWith(
"bf"))
3334 if (listBase[0] == text2)
3341 return flag ? true :
false;
3344 landFeats.Add(row.
id);
3347 landFeats.Add(row.
id);
3351 List<Element> list2 =
new List<Element>();
3352 foreach (
int landFeat
in landFeats)
3361 ZipFile zipFile = ZipFile.Read(path);
3362 zipFile.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
3363 zipFile.ExtractAll(pathTemp);
3382 IO.CreateTempDirectory();
3387 map.
Save(IO.TempPath +
"/", zoneExportData, partial);
3388 map.
ExportMetaData(IO.TempPath +
"/", Path.GetFileNameWithoutExtension(path), partial);
3389 if (partial ==
null)
3391 IO.CopyDir(base.pathSave +
"Texture Replace", IO.TempPath +
"/Texture Replace");
3393 IO.SaveFile(IO.TempPath +
"/export", zoneExportData, compress:
true);
3394 using (ZipFile zipFile =
new ZipFile())
3396 zipFile.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
3397 zipFile.AddDirectory(IO.TempPath);
3401 IO.DeleteTempDirectory();
3403 catch (Exception ex)
3405 EClass.
ui.Say(ex.Message +
":" + path);
3414 if (!
string.IsNullOrEmpty(text))
3427 if (array.Length != 0)
3429 Zone_User zone_User = SpatialGen.Create(
"user", EClass.world.region, register: true) as Zone_User;
3430 zone_User.path = array[0];
3431 Thing thing = ThingGen.Create(
"teleporter");
3432 thing.c_uidZone = zone_User.uid;
3433 EClass._zone.AddCard(thing, EClass.pc.pos);
3444 catch (Exception ex)
3454 string text = pathExport;
3457 Msg.
Say(
"Exported Map:" + text);
3472 return -10000000 + base.uid;
3476 return -8000000 + base.uid;
3480 return -9000000 + base.uid;
3484 return -7000000 + base.uid;
3488 return 1000000 + base.uid;
3508 AddCard(chara, point);
3509 Msg.
Say(
"guestArrive", chara);
3516 AddCard(chara, point);
3524 if (base.IsPlayerFaction)
3544 foreach (
Thing sucker
in Suckers)
3549 if (RespawnRate != 0f)
3559 if (num < MaxRespawn)
3561 for (
int i = 0; i < RespawnPerHour; i++)
3567 if (!date.IsRealTime &&
EClass.
rnd(24) == 0)
3579 if (base.IsPlayerFaction)
3587 if (base.IsPlayerFaction)
3626 HashSet<int> hashSet =
new HashSet<int>();
3633 foreach (
Point item in traitSpotFarm.ListPoints(
null, onlyPassable:
false))
3635 hashSet.Add(
item.index);
3639 EClass.player.isAutoFarming =
false;
3646 void Perform(HashSet<int> farmMap)
3651 if (farmMap !=
null)
3655 if (!farmMap.Contains(c.index))
3660 else if (farmMap.Contains(c.
index))
3674 if (!EClass.player.isAutoFarming && c.growth.HaltGrowth() && (c.IsFarmField || c.IsTopWater) && (!isWinter || !date.IsRealTime))
3679 if (!flag && (plantData ==
null || plantData.fert >= 0))
3685 if (date.sunMap == null)
3695 else if (c.detail !=
null)
3697 c.Things.ForeachReverse(delegate(Thing t)
3699 if (t.IsInstalled && t.trait is TraitSeed && !t.isSale)
3701 (t.trait as TraitSeed).TrySprout(force: false, sucker: false, date);
3705 else if (
EClass.
rnd(20) == 0 && GrowWeed && c.CanGrowWeed &&
EClass.
rnd(weedChance) == 0)
3708 if (c.growth !=
null)
3710 c.growth.SetStage(0);
3714 c.isWatered =
false;
3723 foreach (
Spatial child
in children)
3725 if (!(child is
Zone_Field) && _x == child.
x && _y == child.
y)
3727 return child as
Zone;
3731 foreach (
Spatial child2
in children)
3733 if (_x == child2.
x && _y == child2.
y)
3735 return child2 as
Zone;
3752 bool flag = EClass.player.IsCriminal && HasLaw && !AllowCriminal && !IsPCFaction;
3758 chara.hostility = hostility;
3773 dictCitizen.Clear();
3776 if (
item.trait.IsCitizen && !
item.IsGlobal && !
item.isSubsetCard)
3785 base.isAlarmSet = enable;
3811 base.influence += a;
3814 Msg.
Say(
"gainInfluence", Name, a.ToString() ??
"");
3821 base.development += a;
3824 Msg.
Say(
"gainDevelopment", Name, a.ToString() ??
"");
3830 if (!IsPCFaction && (!(
this is
Zone_Town) || base.lv != 0))
3834 Debug.Log(
"Updating Quest:" + force);
3841 if (
item.quest.IsExpired || completedQuests.Contains(
item.quest.uid) || force)
3859 maxQuest = 4 + EClass.rnd(4);
3861 completedQuests.Clear();
3863 List<Tuple<string, int>> listTag =
new List<Tuple<string, int>>();
3867 array =
new string[9] {
"supply/8",
"deliver/7",
"food/8",
"escort/4",
"deliver/4",
"monster/0",
"war/0",
"farm/0",
"music/0" };
3869 string[] array2 = array;
3870 for (
int i = 0; i < array2.Length; i++)
3872 string[] array3 = array2[i].Split(
'/');
3873 listTag.Add(
new Tuple<string, int>(array3[0], array3[1].ToInt()));
3875 for (
int j = 0; j < map.charas.Count * 2; j++)
3893 foreach (Tuple<string, int> item2
in listTag)
3895 if (a.tags.Contains(item2.Item1))
3905 return a.chance * num2;
3917 List<Chara> list =
new List<Chara>();
3953 for (
int i = 0; i < 2 +
EClass.
rnd(4); i++)
3955 Point point = GetPos();
3963 thing.isLostProperty =
true;
3965 int num2 = (thing.c_lockLv =
EClass.
rndHalf(Mathf.Min(base.development / 10 + 10, 50)));
3982 static Point GetPos()
3984 for (
int j = 0; j < 10; j++)
3998 bool flag =
this is
Zone_Yowyn && base.lv == -1;
4005 if (EClass.player.doneBackers.Contains(a.id))
4023 if (chara.
id !=
"follower")
4034 if (
item.chara == chara.
id)
4046 if (fortuneRoll ==
null)
4051 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
SourceMaterial.Row material
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)
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
virtual void SetMainFaction(Faction f)
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
Thing TryGetRestock< T >(string idCat)
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
List< Thing > TryListThingsInSpot< T >(Func< Thing, bool > func=null)
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)
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)
bool TryAddThingInSpot< T >(Thing t, bool useContainer=true)
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)