1121{
1123 {
1124 idHat = null;
1125 base.dateHat = 0;
1126 }
1128 }
1129
1130 public void OnVisit()
1131 {
1133 {
1134 ResetHostility();
1136 List<Chara> list = new List<Chara>();
1138 {
1141 {
1142 chara.c_fur = 0;
1143 }
1145 {
1146 list.Add(chara);
1147 }
1148 }
1150 {
1152 }
1153 }
1155 {
1156 RefreshDeathSentense();
1157 }
1158 RefreshCriminal();
1160 events.OnVisit();
1161 OnActivate();
1162 UpdateQuests();
1163 OnBeforeSimulate();
1164 isSimulating = true;
1165 Simulate();
1166 isSimulating = false;
1167 OnAfterSimulate();
1169 {
1171 }
1174 {
1175 base.visitCount++;
1176 }
1178 if (fieldElements.dict.Count() > 0)
1179 {
1181 }
1182 }
1183
1184 public void RefreshDeathSentense()
1185 {
1187 {
1189 {
1191 }
1192 }
1193 }
1194
1196 {
1198 if (ShouldAutoRevive)
1199 {
1200 foreach (
Chara deadChara
in map.deadCharas)
1201 {
1203 {
1206 {
1208 }
1210 }
1211 }
1212 }
1214 {
1216 {
1218 Point point = GetSpawnPos(value);
1220 {
1222 }
1224 }
1225 }
1226 map.deadCharas.Clear();
1227 }
1228
1229 public virtual void OnRegenerate()
1230 {
1231 }
1232
1233 public virtual void OnActivate()
1234 {
1235 if (!(id == "startVillage2"))
1236 {
1237 return;
1238 }
1240 {
1241 SetBGM(121, refresh: false);
1242 }
1243 int num = 0;
1245 {
1247 {
1248 num++;
1249 }
1250 }
1251 if (num > 0)
1252 {
1253 Msg.
Say(
"num_silvercat", num.ToString() ??
"");
1254 }
1255 }
1256
1257 public virtual void OnBeforeDeactivate()
1258 {
1259 }
1260
1261 public virtual void OnDeactivate()
1262 {
1263 }
1264
1265 public virtual void OnBeforeSimulate()
1266 {
1267 }
1268
1269 public virtual void OnVisitNewMapOrRegenerate()
1270 {
1271 }
1272
1273 public virtual void OnAfterSimulate()
1274 {
1275 }
1276
1277 public virtual void OnAdvanceHour()
1278 {
1279 }
1280
1281 public void Simulate()
1282 {
1284 {
1285 if (
Boss !=
null && IsNefia)
1286 {
1290 }
1291 int num = Mathf.Clamp(MinsSinceLastActive, 1, 10000);
1293 {
1295 {
1296 chara2.hp = 0;
1297 }
1299 {
1301 {
1302 chara2.mana.value = 0;
1303 }
1305 {
1306 chara2.stamina.value = 0;
1307 }
1308 }
1309 if (num > 60)
1310 {
1311 chara2.resistCon = null;
1312 }
1314 {
1315 Msg.ignoreAll = true;
1317 chara2.
HealHP((
int)((
long)Mathf.Max(1, chara2.
MaxHP) * (
long)Mathf.Min(num, 20) / 20));
1318 chara2.
mana.
Mod(Mathf.Max(1, chara2.
mana.
max) * Mathf.Min(num, 20) / 20);
1320 Msg.ignoreAll = false;
1321 }
1322 }
1323 }
1324 Debug.Log(
"Last Active:" + base.lastActive);
1325 if (base.lastActive == 0 || HourSinceLastActive <= 1 || IsRegion)
1326 {
1327 return;
1328 }
1329 Debug.Log(Name +
" Simulate:" + HourSinceLastActive +
" hours");
1332 int num2 = HourSinceLastActive / 24;
1333 int num3 = 0;
1334 if (num2 > 0)
1335 {
1337 {
1338 if (!
item.IsPCParty)
1339 {
1340 item.OnSleep(200, num2);
1341 if (
item.conSleep !=
null)
1342 {
1343 item.conSleep.Kill();
1344 }
1346 {
1348 }
1349 if (
item.things.Count > 20)
1350 {
1352 }
1353 }
1354 }
1355 }
1356 VirtualDate.current = virtualDate;
1357 for (int i = 0; i < HourSinceLastActive; i++)
1358 {
1361 {
1362 num3++;
1363 }
1364 }
1366 {
1368 });
1369 VirtualDate.current = null;
1370 if (!IsPCFaction)
1371 {
1372 return;
1373 }
1374 int num4 = 0;
1375 foreach (
Chara item2
in list)
1376 {
1378 {
1379 continue;
1380 }
1382 {
1383 if (item2.
id ==
"bee")
1384 {
1385 num4++;
1386 }
1387 if (num2 > 0 && item2.
IsGuest())
1388 {
1391 }
1392 continue;
1393 }
1394 if (num2 > 0)
1395 {
1397 item2.
SetAI(goalWork);
1399 {
1400 (goalWork as
GoalWork).FindWork(item2);
1401 }
1404 item2.
SetAI(goalWork);
1406 {
1407 (goalWork as
GoalWork).FindWork(item2);
1408 }
1410 }
1413 {
1415 }
1416 }
1417 List<Thing> list2 = new List<Thing>();
1419 {
1421 {
1422 list2.Add(thing);
1423 }
1424 }
1425 if (num4 >= list2.Count)
1426 {
1427 return;
1428 }
1429 for (int j = num4; j < list2.Count; j++)
1430 {
1431 if (
EClass.
rnd(200) <= HourSinceLastActive)
1432 {
1434 AddCard(chara, list2.RandomItem().pos);
1436 chara.c_originalHostility = c_originalHostility;
1437 }
1438 }
1439 }
1440
1442 {
1446 bool flag = zone ==
null || zone.lv > base.
lv;
1447 if (IsRegion)
1448 {
1450 {
1452 if (GetZoneAt(topZone.
x, topZone.
y) !=
null)
1453 {
1455 }
1456 }
1457 }
1459 {
1461 }
1463 {
1464 enterState = RegionEnterState;
1465 }
1467 {
1469 }
1470 float rate = zoneTransition?.
ratePos ?? (-1f);
1471 if (IsPCFaction)
1472 {
1474 {
1476 if (spot != null)
1477 {
1479 if (nearestPoint !=
null && nearestPoint.
IsValid)
1480 {
1481 return nearestPoint;
1482 }
1483 }
1484 }
1485 }
1486 while (true)
1487 {
1488 switch (enterState)
1489 {
1491 return new Point(zoneTransition.
x, zoneTransition.
z);
1493 {
1495 {
1497 {
1499 if (traitTeleporter != null)
1500 {
1502 }
1503 if (traitTeleporter !=
null && !zoneTransition.
idTele.IsEmpty() && zoneTransition.
idTele == traitTeleporter.
id.IsEmpty(traitTeleporter.
GetParam(3)))
1504 {
1506 }
1507 }
1508 }
1510 {
1512 {
1514 }
1515 }
1517 if (randomThing2 != null)
1518 {
1520 }
1522 }
1526 {
1528 {
1530 {
1532 {
1534 }
1535 }
1537 if (randomThing != null)
1538 {
1540 }
1541 }
1544 if (thing != null)
1545 {
1547 }
1549 if (thing != null)
1550 {
1552 }
1553 if (base.lv == 0)
1554 {
1555 goto IL_04a1;
1556 }
1557 flag = base.lv <= 0;
1558 break;
1559 }
1562 if (map.config.embarkX != 0)
1563 {
1564 return new Point(map.config.embarkX, map.config.embarkY);
1565 }
1566 return map.GetCenterPos().GetNearestPoint(allowBlock: false, allowChara: false);
1568 return map.bounds.GetTopPos(rate).GetNearestPoint(allowBlock: false, allowChara: false);
1570 return map.bounds.GetRightPos(rate).GetNearestPoint(allowBlock: false, allowChara: false);
1572 return map.bounds.GetBottomPos(rate).GetNearestPoint(allowBlock: false, allowChara: false);
1574 return map.bounds.GetLeftPos(rate).GetNearestPoint(allowBlock: false, allowChara: false);
1580 {
1581 return new Point(map.config.embarkX, map.config.embarkY);
1582 }
1583 return new Point(zoneTransition.
x, zoneTransition.
z);
1585 return GetRandomVisitPos(c);
1587 flag = true;
1588 break;
1590 flag = false;
1591 break;
1592 }
1593 break;
1594 IL_04a1:
1596 }
1598 {
1600 {
1601 if (c != null && enterState != 0)
1602 {
1603 c.
SetDir(traitNewZone.owner.dir);
1604 }
1605 return traitNewZone.GetExitPos();
1606 }
1607 }
1609 {
1610 if (thing6.
trait is
TraitNewZone traitNewZone2 && ((flag && traitNewZone2.IsUpstairs) || (!flag && traitNewZone2.IsDownstairs)))
1611 {
1612 if (c != null && enterState != 0)
1613 {
1614 c.
SetDir(traitNewZone2.owner.dir);
1615 }
1616 return traitNewZone2.GetExitPos();
1617 }
1618 }
1619 return GetRandomVisitPos(c);
1620 }
1621
1623 {
1625 if (
EClass.
rnd(3) == 0 && map.rooms.listRoom.Count > 0)
1626 {
1627 point = map.rooms.listRoom.RandomItem().points.RandomItem();
1628 }
1629 if (point ==
null &&
EClass.
rnd(4) != 0)
1630 {
1632 if (ie.Count() > 0)
1633 {
1635 }
1636 }
1637 if (point == null)
1638 {
1639 point = map.bounds.GetRandomSurface(centered:
false, walkable:
true, !IsPCFaction && !(
this is
Zone_Civilized)) ?? map.bounds.
GetRandomPoint();
1640 }
1642 }
1643
1644 public void AddGlobalCharasOnActivate()
1645 {
1646 Point spawnPosPC =
null;
1648 {
1649 spawnPosPC = GetSpawnPos(
EClass.
pc);
1650 }
1651 if (spawnPosPC == null)
1652 {
1653 spawnPosPC = map.GetCenterPos();
1654 }
1656 {
1658 }
1661 {
1663 {
1664 continue;
1665 }
1667 {
1670 }
1671 else
1672 {
1674 {
1675 continue;
1676 }
1678 {
1679 c.isRestrained = false;
1680 }
1682 {
1683 Point pos = (c.IsPC ? spawnPosPC : (c.IsPCParty ? spawnPosPC.
GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true) : GetSpawnPos(c)));
1685 {
1687 {
1688 pos.
Set(spawnPosPC);
1689 }
1691 {
1694 {
1696 {
1698 return true;
1699 }
1700 return false;
1701 }, allowBlock: false, EClass.pc.party.members.Count >= 12, allowInstalled: true, ignoreCenter: true, EClass._zone.IsRegion ? 2 : 6))
1702 {
1703 pos.
Set(spawnPosPC);
1704 }
1705 }
1706 }
1708 c.global.transition = null;
1709 }
1710 map.charas.Add(c);
1711 map.AddCardOnActivate(c);
1712 }
1713 }
1715 {
1716 Point nearestPoint = spawnPosPC.
GetNearestPoint(allowBlock:
false, allowChara:
false, allowInstalled:
true, ignoreCenter:
true);
1717 item.enemy = null;
1718 item.pos.Set(nearestPoint);
1719 map.charas.Add(
item);
1720 map.AddCardOnActivate(
item);
1721 }
1723 }
1724
1725 public void Deactivate()
1726 {
1727 if (!IsUserZone && !IsPCFaction && map != null)
1728 {
1729 List<Thing> list = new List<Thing>();
1731 {
1733 {
1734 list.Add(thing);
1735 }
1736 }
1738 {
1739 foreach (
Thing item in map.props.stocked.Things.Concat(map.props.roaming.Things))
1740 {
1741 if (
item.IsContainer)
1742 {
1744 {
1746 {
1747 list.Add(thing2);
1748 }
1749 }
1750 }
1752 {
1754 }
1755 }
1756 }
1757 if (list.Count > 0)
1758 {
1759 Msg.
Say(
"pick_valuable");
1760 foreach (
Thing item2
in list)
1761 {
1762 Msg.
Say(
"pick_valuable2", item2);
1764 }
1765 }
1766 }
1768 {
1769 base.isPeace = false;
1770 }
1771 OnBeforeDeactivate();
1772 if (IsPCFaction)
1773 {
1774 foreach (
Chara member
in branch.members)
1775 {
1777 }
1778 }
1781 map.OnDeactivate();
1783 EClass.game.activeZone = null;
1784 if (IsInstance)
1785 {
1786 UnloadMap();
1787 base.isGenerated = false;
1788 }
1789 if (forceRegenerate)
1790 {
1791 UnloadMap();
1792 }
1793 OnDeactivate();
1794 }
1795
1796 public void OnKillGame()
1797 {
1799 {
1801 {
1803 }
1804 }
1805 }
1806
1807 public void UnloadMap()
1808 {
1809 map = null;
1810 if (bp != null)
1811 {
1812 bp.map = null;
1813 }
1814 if (branch != null)
1815 {
1816 branch.OnUnloadMap();
1817 }
1818 Debug.Log(
"Unloaded Map:" +
this);
1819 }
1820
1821 public void ClaimZone(
bool debug =
false,
Point pos =
null)
1822 {
1826 branch.OnCreate(this);
1827 if (base.icon == 0)
1828 {
1829 base.icon = 332;
1830 }
1831 instance = null;
1832 base.dateExpire = 0;
1834 Register();
1836 {
1837 thing.isNPCProperty = false;
1838 }
1841 if (debug)
1842 {
1843 for (int i = 0; i < 7; i++)
1844 {
1847 branch.AddMemeber(chara);
1848 }
1849 }
1850 else
1851 {
1856 if (pos == null)
1857 {
1859 }
1862 }
1863 base.idPrefix = 0;
1865 {
1867 }
1869 {
1872 }
1873 }
1874
1875 public void AbandonZone()
1876 {
1879 {
1882 {
1884 }
1885 });
1887 SetMainFaction(null);
1889 }
1890
1891 public bool CanDestroy()
1892 {
1894 {
1895 return false;
1896 }
1897 if (IsInstance)
1898 {
1899 return true;
1900 }
1901 bool flag = false;
1902 switch (id)
1903 {
1904 case "cave_dragon":
1906 {
1907 flag = true;
1908 }
1909 break;
1910 case "cave_yeek":
1912 {
1913 flag = true;
1914 }
1915 break;
1916 case "cave_mino":
1918 {
1919 flag = true;
1920 }
1921 break;
1922 case "cave_dead":
1924 {
1925 flag = true;
1926 }
1927 break;
1928 }
1929 Zone topZone = GetTopZone();
1930 if (!flag)
1931 {
1933 {
1934 return false;
1935 }
1936 if (!base.isRandomSite && !(
this is
Zone_Field) && (topZone ==
null || topZone ==
this || topZone.
FindDeepestZone() ==
this))
1937 {
1938 return false;
1939 }
1940 }
1942 {
1943 return false;
1944 }
1946 {
1948 if (zone !=
null && zone.
GetTopZone() ==
this)
1949 {
1950 return false;
1951 }
1952 }
1953 return true;
1954 }
1955
1956 public override void _OnBeforeSave()
1957 {
1958 if (CanDestroy())
1959 {
1960 Debug.Log(
"Deleting Zone:" +
this);
1961 if (!destryoed)
1962 {
1963 Destroy();
1964 }
1965 }
1966 else if (map != null)
1967 {
1968 Debug.Log(
"Saving Zone:" +
this);
1969 map.Save(base.pathSave);
1970 if (!base.isMapSaved)
1971 {
1972 base.isMapSaved = true;
1974 IO.
CopyDir(pathTemp +
"Texture Replace", base.pathSave +
"/Texture Replace");
1975 }
1976 if (!IsActiveZone)
1977 {
1978 UnloadMap();
1979 }
1980 }
1981 }
1982
1983 public override void OnLoad()
1984 {
1985 if (branch != null)
1986 {
1987 branch.SetOwner(this);
1988 }
1989 events.OnLoad(this);
1990 }
1991
1992 public override void Destroy()
1993 {
1994 children.ForeachReverse(delegate(
Spatial z)
1995 {
1997 });
1998 if (map != null)
1999 {
2000 UnloadMap();
2001 }
2002 if (parent != null && parent.IsRegion && instance == null)
2003 {
2005 }
2007 destryoed = true;
2008 base.isGenerated = false;
2009 }
2010
2011 public void ClearZones(
Zone current =
null)
2012 {
2013 if (map != null)
2014 {
2015 UnloadMap();
2016 }
2017 base.isGenerated = false;
2018 Zone topZone = GetTopZone();
2019 if (topZone != this)
2020 {
2022 return;
2023 }
2024 children.ForeachReverse(delegate(
Spatial c)
2025 {
2026 if (c != current)
2027 {
2029 }
2030 });
2031 }
2032
2033 public void OnChildNumChange(
Card c)
2034 {
2035 }
2036
2038 {
2039 return this;
2040 }
2041
2042 public Zone GetTopZone()
2043 {
2044 if (parent == null || parent.IsRegion)
2045 {
2046 return this;
2047 }
2048 return parent as
Zone;
2049 }
2050
2051 public Card AddCardSplinkle(
Card t,
Point center,
int radius = 4)
2052 {
2054 for (int i = 0; i < 1000; i++)
2055 {
2059 {
2060 return AddCard(t, point);
2061 }
2062 }
2063 return AddCard(t, center);
2064 }
2065
2066 public Chara AddChara(
string id,
int x,
int z)
2067 {
2069 }
2070
2072 {
2073 return AddChara(
id, p.
x, p.
z);
2074 }
2075
2076 public Card AddThing(
string id,
int x,
int z)
2077 {
2079 }
2080
2081 public Card AddThing(
string id,
Point p)
2082 {
2083 return AddThing(
id, p.
x, p.
z);
2084 }
2085
2087 {
2088 return AddCard(t, point.
x, point.
z);
2089 }
2090
2092 {
2093 return AddCard(t, 0, 0);
2094 }
2095
2096 public Card AddCard(
Card t,
int x,
int z)
2097 {
2099 {
2101 }
2102 t.parent = this;
2104 if (chara != null)
2105 {
2106 chara.currentZone = this;
2108 }
2109 if (IsActiveZone)
2110 {
2111 map.OnCardAddedToZone(t, x, z);
2113 {
2115 }
2116 ignoreSpawnAnime = false;
2117 }
2119 {
2121 chara.hasSpawned = true;
2122 }
2123 return t;
2124 }
2125
2126 public void RemoveCard(
Card t)
2127 {
2128 if (IsActiveZone)
2129 {
2130 map.OnCardRemovedFromZone(t);
2131 }
2132 t.parent = null;
2134 {
2135 t.Chara.currentZone = null;
2136 }
2138 {
2140 }
2142 {
2144 }
2145 }
2146
2147 public T GetRandomSpot<T>() where T :
Trait
2148 {
2150 }
2151
2152 public bool TryAddThingInSpot<T>(
Thing t,
bool useContainer =
true) where T :
Trait
2153 {
2155 if (randomThing == null)
2156 {
2158 return false;
2159 }
2161 {
2162 List<Thing> list = new List<Thing>();
2164 {
2165 foreach (
Card item2
in item.ListCards())
2166 {
2168 {
2169 list.Add(item2.
Thing);
2170 }
2171 }
2172 }
2173 if (TryAddThingInSharedContainer(t, list, add: true, msg: false, null, sharedOnly: false))
2174 {
2175 return true;
2176 }
2177 }
2179 return true;
2180 }
2181
2182 public List<Thing> TryListThingsInSpot<T>(Func<Thing, bool> func =
null) where T :
TraitSpot
2183 {
2184 List<T> list = new List<T>();
2185 List<Thing> list2 = new List<Thing>();
2187 {
2189 {
2190 list.Add(thing.
trait as T);
2191 }
2192 }
2193 foreach (T
item in list)
2194 {
2195 foreach (
Point item2
in item.ListPoints(
null, onlyPassable:
false))
2196 {
2198 {
2200 {
2201 continue;
2202 }
2203 if (thing2.
things.Count == 0)
2204 {
2205 if (IsValid(thing2))
2206 {
2207 list2.Add(thing2);
2208 }
2209 continue;
2210 }
2212 {
2213 list2.Add(item3);
2214 }
2215 }
2216 }
2217 }
2218 return list2;
2219 bool IsValid(
Thing t)
2220 {
2221 if (func != null && !func(t))
2222 {
2223 return false;
2224 }
2225 return true;
2226 }
2227 }
2228
2229 public bool TryAddThingInSharedContainer(
Thing t, List<Thing> containers =
null,
bool add =
true,
bool msg =
false,
Chara chara =
null,
bool sharedOnly =
true)
2230 {
2232 int priority = -1;
2235 {
2237 }
2238 if (containers == null)
2239 {
2241 }
2242 if (SearchDest() != null)
2243 {
2244 return true;
2245 }
2246 if (dest == null)
2247 {
2248 return false;
2249 }
2250 if (add)
2251 {
2252 if (msg)
2253 {
2255 }
2257 }
2258 return true;
2260 {
2261 foreach (
Thing container
in containers)
2262 {
2263 Thing thing = container;
2265 {
2267 }
2269 {
2271 if (windowSaveData != null)
2272 {
2274 {
2275 continue;
2276 }
2279 {
2282 {
2283 continue;
2284 }
2285 }
2287 {
2289 {
2290 bool flag2 = false;
2291 foreach (
int cat
in windowSaveData.
cats)
2292 {
2294 {
2295 flag2 = true;
2296 break;
2297 }
2298 }
2299 if (!flag2)
2300 {
2301 continue;
2302 }
2303 }
2304 else if (windowSaveData.
flag.HasFlag(flag))
2305 {
2306 continue;
2307 }
2308 }
2309 priority = windowSaveData.
priority;
2310 }
2311 else
2312 {
2313 if (priority != -1)
2314 {
2315 continue;
2316 }
2317 priority = 0;
2318 }
2319 dest = thing;
2320 }
2321 }
2322 return null;
2323 }
2324 }
2325
2326 public bool TryAddThing(
Thing target,
Point p,
bool destroyIfFail =
false)
2327 {
2328 int num = 0;
2330 {
2332 {
2334 {
2336 {
2337 return true;
2338 }
2339 num++;
2340 }
2341 }
2342 }
2343 if (num == 0 || !destroyIfFail)
2344 {
2346 return true;
2347 }
2349 return false;
2350 }
2351
2352 public Thing TryGetThingFromSharedContainer(Func<Thing, bool> func)
2353 {
2355 {
2357 {
2359 if (thing != null)
2360 {
2361 return thing;
2362 }
2363 }
2364 }
2365 return null;
2366 }
2367
2369 {
2370 List<T> list = new List<T>();
2372 {
2374 {
2375 list.Add(thing2.
trait as T);
2376 }
2377 }
2378 foreach (T
item in list)
2379 {
2380 foreach (
Point item2
in item.ListPoints(
null, onlyPassable:
false))
2381 {
2383 {
2385 {
2386 continue;
2387 }
2388 if (thing3.
things.Count == 0)
2389 {
2390 if (IsValid(thing3, insideContainer: false))
2391 {
2392 return thing3;
2393 }
2394 continue;
2395 }
2397 if (thing != null)
2398 {
2399 return thing;
2400 }
2401 }
2402 }
2403 }
2404 return null;
2405 bool IsValid(
Thing t,
bool insideContainer)
2406 {
2408 {
2409 return false;
2410 }
2411 return true;
2412 }
2413 }
2414
2416 {
2417 string text = IdProfile;
2418 if (text.IsEmpty())
2419 {
2421 if (base.lv != 0)
2422 {
2423 text = ((base.lv < 0) ? "Underground" : "Sky");
2424 }
2425 else if (region != null)
2426 {
2429 if (bp != null)
2430 {
2431 name =
Lang.
GetList(
"zone_" + text.Split(
'/')[1]).RandomItem();
2433 for (int i = 0; i < 3; i++)
2434 {
2435 for (int j = 0; j < 3; j++)
2436 {
2438 }
2439 }
2440 if (text == "Random/R_Shore")
2441 {
2442 base.isBeach = true;
2443 }
2444 }
2445 }
2446 else
2447 {
2448 text = "Random";
2449 }
2450 idProfile = text;
2451 }
2453 }
2454
2455 public void CreateBP()
2456 {
2458 bp.Create();
2459 bp.genSetting.seed = base.Seed;
2460 OnCreateBP();
2461 }
2462
2463 public virtual void OnCreateBP()
2464 {
2465 }
2466
2467 public void Generate()
2468 {
2469 base.isGenerated = true;
2470 if (bp == null)
2471 {
2472 CreateBP();
2473 }
2474 if (bp.map == null)
2475 {
2476 bp.GenerateMap(this);
2477 }
2478 map.SetZone(this);
2480 bool flag = IdBiome == "Sand" || IdBiome == "Water" || IsUnderwater;
2481 if (flag)
2482 {
2483 int num = 1 +
EClass.
rnd((IdBiome ==
"Water") ? 3 : 2);
2484 for (int i = 0; i < num; i++)
2485 {
2488 {
2489 Thing t =
ThingGen.
Create(
"pearl_oyster",
new string[3] {
"wood_birch",
"poplar",
"coralwood" }.RandomItem(), ContentLv);
2491 }
2492 }
2494 for (int j = 0; j < num; j++)
2495 {
2498 {
2500 }
2501 }
2503 {
2505 if (!randomSurface3.
HasObj)
2506 {
2508 }
2509 }
2510 }
2511 if (IsUnderwater)
2512 {
2513 for (
int l = 0; l < 30 +
EClass.
rnd(30); l++)
2514 {
2516 }
2521 if (IsNefia)
2522 {
2524 if (num3 > 0)
2525 {
2531 }
2532 }
2534 {
2535 int num6 = 137;
2536 foreach (
Point point
in r.points)
2537 {
2539 {
2540 map.
SetObj(point.
x, point.
z, num6);
2544 {
2546 }
2547 }
2548 }
2549 return false;
2550 });
2552 {
2553 int num5 = 136;
2554 foreach (
Point point2
in r.points)
2555 {
2557 {
2559 }
2560 }
2561 return false;
2562 });
2564 {
2565 int idFloor = 121;
2566 foreach (
Point point3
in r.points)
2567 {
2569 }
2570 return false;
2571 });
2572 }
2573 if (zone_Field != null)
2574 {
2576 {
2578 for (int m = 0; m < num4; m++)
2579 {
2582 {
2585 }
2586 }
2587 }
2589 {
2590 SpawnAltar();
2591 }
2592 TrySpawnFollower();
2594 {
2597 {
2599 }
2600 }
2601 if (base.Tile.isRoad)
2602 {
2604 {
2606 }
2607 }
2608 }
2609 map.plDay = CreatePlaylist(ref map._plDay,
EClass.
Sound.GetPlaylist(IDPlayList) ??
EClass.
Sound.GetPlaylist(
"Day"));
2610 }
2611
2612 public void TrySpawnFollower()
2613 {
2616 {
2617 return;
2618 }
2621 {
2622 return;
2623 }
2629 {
2631 if (row != null)
2632 {
2634 }
2635 }
2637 for (
int i = 0; i < 3 +
EClass.
rnd(4); i++)
2638 {
2643 }
2644 }
2645
2646 public void SpawnAltar()
2647 {
2649 {
2650 if (r.points.Count <= 4)
2651 {
2652 return false;
2653 }
2654 map.poiMap.OccyupyPOI(r.points[0]);
2655 List<Point> points = r.points;
2657 "altarPoint".lang(randomReligion.NameDomain.lang());
2662 for (
int i = 0; i < 2 +
EClass.
rnd(2); i++)
2663 {
2666 }
2668 {
2670 }
2672 {
2673 if (
item.x % 3 == 0 &&
item.z % 2 == 0 &&
item != points[0] && !
item.Equals(points[0].Front) &&
item.Installed ==
null)
2674 {
2675 thing = ThingGen.Create("pillar1");
2676 EClass._zone.AddCard(thing, item).Install();
2677 }
2679 item.SetFloor(3, 6);
2680 }
2681 return true;
2682 });
2683 }
2684
2685 public virtual void OnGenerateMap()
2686 {
2687 if (MakeEnemiesNeutral)
2688 {
2690 {
2692 {
2694 chara.hostility = hostility2;
2695 }
2696 }
2697 }
2698 if (PrespawnRate != 0f && !IsSkyLevel)
2699 {
2700 for (int i = 0; i < (int)((float)MaxSpawn * PrespawnRate); i++)
2701 {
2702 SpawnMob();
2703 }
2704 }
2705 TryGenerateOre();
2706 TryGenerateBigDaddy();
2707 TryGenerateEvolved();
2708 TryGenerateShrine();
2709 }
2710
2711 public void TryGenerateOre()
2712 {
2713 if (OreChance <= 0f)
2714 {
2715 return;
2716 }
2718 {
2719 byte b = 18;
2720 string group = "ore";
2721 if (EClass.rnd(5) == 0)
2722 {
2723 b++;
2724 group = "gem";
2725 }
2727 foreach (
Point point in r.points)
2728 {
2729 if (point.sourceBlock.ContainsTag("ore"))
2730 {
2731 map.SetObj(point.x, point.z, randomMaterial.id, b, 1, 0);
2732 }
2733 }
2734 return false;
2735 });
2736 }
2737
2738 public Chara TryGenerateEvolved(
bool force =
false,
Point p =
null)
2739 {
2742 {
2743 return null;
2744 }
2746 for (
int i = 0; i < 2 +
EClass.
rnd(2); i++)
2747 {
2749 }
2752 {
2754 }
2755 return chara;
2756 }
2757
2758 public void TryGenerateBigDaddy()
2759 {
2761 {
2763 List<string> list = new List<string> { "big_daddy", "big_daddy2" };
2764 list.Shuffle();
2765 Spawn(list[0], spawnPos);
2767 {
2768 Spawn(list[1], spawnPos.
GetNearestPoint(allowBlock:
false, allowChara:
false));
2769 }
2770 Msg.
Say(
"sign_bigdaddy");
2771 }
2772 void Spawn(
string id,
Point pos)
2773 {
2774 int num = (int)((long)DangerLv * 125L / 100);
2775 if (num >= 30)
2776 {
2778 {
2779 lv = num
2780 });
2781 }
2784 {
2786 }
2788 {
2790 }
2792 }
2793 }
2794
2795 public void TryGenerateShrine()
2796 {
2798 for (int i = 0; i < 3; i++)
2799 {
2802 {
2803 continue;
2804 }
2806 if (randomSpace == null)
2807 {
2808 continue;
2809 }
2813 {
2814 continue;
2815 }
2820 {
2823 }
2824 else
2825 {
2827 }
2828 }
2830 }
2831
2832 public void ResetHostility()
2833 {
2835 {
2837 {
2838 chara.c_originalHostility = (
Hostility)0;
2839 }
2842 {
2844 }
2845 }
2846 }
2847
2848 public virtual void OnGenerateRooms(
BaseMapGen gen)
2849 {
2850 }
2851
2853 {
2855 for (int i = 0; i < tries; i++)
2856 {
2859 {
2860 continue;
2861 }
2862 switch (type)
2863 {
2865 {
2868 {
2869 continue;
2870 }
2871 break;
2872 }
2875 {
2876 continue;
2877 }
2878 break;
2879 }
2880 return point;
2881 }
2882 return null;
2883 }
2884
2885 public Chara SpawnMob(
string id,
Point pos =
null)
2886 {
2888 {
2889 id = id
2890 });
2891 }
2892
2894 {
2895 if (setting == null)
2896 {
2898 }
2899 if (pos == null)
2900 {
2901 pos = GetSpawnPos(setting.position, setting.tries);
2902 if (pos == null)
2903 {
2905 if (pos == null)
2906 {
2907 return null;
2908 }
2909 }
2910 }
2912 if (IsUnderwater &&
EClass.
rnd(15) != 0)
2913 {
2915 }
2917 if (setting.idSpawnList != null)
2918 {
2920 }
2922 {
2924 }
2926 {
2927 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);
2928 }
2930 {
2932 }
2934 {
2935 spawnList =
SpawnList.
Get(IsInstance ?
"c_neutral_war" :
"c_neutral");
2936 }
2938 {
2941 {
2942 ShouldPass = (
SourceChara.Row s) => (!(s.hostility !=
"") || (!s.tag.Contains(
"cat") && !s.race_row.tag.Contains(
"cat"))) ? true :
false
2943 }));
2944 }
2945 else
2946 {
2948 {
2950 {
2951 if (s.hostility != "")
2952 {
2953 return false;
2954 }
2955 return s.biome == biome.name || s.biome.IsEmpty();
2956 }
2957 });
2958 }
2959 int num = ((setting.dangerLv == -1) ? DangerLv : setting.dangerLv);
2961 {
2963 idEle = setting.idEle
2964 };
2965 int num2 = ((setting.filterLv == -1) ? num : setting.filterLv);
2967 {
2968 num2 = ((num - 1) % 50 + 5) * 150 / 100;
2969 if (num2 >= 20 &&
EClass.
rnd(100) < num2)
2970 {
2971 num2 = num;
2972 }
2973 }
2976 {
2979 }
2980 long num3 = ((setting.fixedLv == -1) ? cardRow.
LV : setting.fixedLv);
2981 bool flag = setting.fixedLv != -1 || DangerLvBoost > 0;
2982 num3 += setting.addLv;
2984 {
2985 num3 = (50L + (long)cardRow.
LV) * Mathf.Max(1, (num - 1) / 50);
2986 flag = true;
2987 }
2988 num3 += DangerLvBoost;
2989 if (setting.rarity ==
Rarity.Random && cardRow.
quality == 0)
2990 {
2992 {
2993 cardBlueprint.rarity =
Rarity.Legendary;
2994 num3 = num3 * 125 / 100;
2995 }
2996 }
2997 else
2998 {
2999 cardBlueprint.rarity = setting.rarity;
3000 }
3001 if (setting.isBoss)
3002 {
3003 num3 = num3 * 150 / 100;
3004 }
3005 if (setting.isEvolved)
3006 {
3007 num3 = num3 * 2 + 20;
3008 }
3009 if (num3 != cardRow.
LV)
3010 {
3011 cardBlueprint.lv = (int)Mathf.Min(num3, 100000000f);
3012 }
3015 if (!flag)
3016 {
3017 chara.isScaled = false;
3018 }
3019 AddCard(chara, pos);
3020 if (setting.forcedHostility.HasValue)
3021 {
3022 Hostility c_originalHostility = (chara.hostility = setting.forcedHostility.Value);
3023 chara.c_originalHostility = c_originalHostility;
3024 }
3025 else
3026 {
3028 {
3029 case "unicorn":
3031 {
3033 }
3034 break;
3035 case "santa":
3036 case "silverwolf":
3037 case "twintail":
3038 case "test17":
3040 {
3042 }
3044 {
3046 }
3047 break;
3048 }
3049 }
3050 if (setting.isBoss)
3051 {
3053 }
3054 if (setting.isEvolved)
3055 {
3056 chara.c_bossType =
BossType.Evolved;
3057 }
3058 if (DangerLv >= 20 && !IsPCFaction && !IsTown &&
EClass.
rnd(200) == 0)
3059 {
3061 }
3062 return chara;
3063 }
3064
3065 public bool HasField(int idEle)
3066 {
3067 return fieldElements.Has(idEle);
3068 }
3069
3070 public void SetFieldEffect(int idEle, int a)
3071 {
3072 fieldElements.SetBase(idEle, a);
3073 }
3074
3075 public void RefreshElectricity()
3076 {
3077 dirtyElectricity = false;
3078 bool flag = GetSoilCost() > MaxSoil;
3079 base.electricity = elements.Value(2201) * 10 + BaseElectricity;
3081 {
3083 {
3085 }
3086 }
3087 if (!flag)
3088 {
3090 {
3092 {
3093 base.electricity += 20;
3094 }
3095 });
3096 }
3098 {
3100 {
3102 }
3103 }
3104 }
3105
3106 public int GetElectricity(bool cost = false)
3107 {
3108 bool flag = GetSoilCost() > MaxSoil;
3109 int sum = 0;
3111 {
3113 {
3114 continue;
3115 }
3116 if (cost)
3117 {
3119 {
3121 }
3122 }
3124 {
3126 }
3127 }
3128 if (!cost)
3129 {
3130 sum += elements.Value(2201) * 10 + BaseElectricity;
3131 if (!flag)
3132 {
3134 {
3136 {
3137 sum += 20;
3138 }
3139 });
3140 }
3141 }
3142 return sum;
3143 }
3144
3145 public void SetBGM(List<int> ids, bool refresh = true, float fadeDuration = 0f)
3146 {
3147 map._plDay.Clear();
3148 if (ids.Count > 0)
3149 {
3150 foreach (int id in ids)
3151 {
3152 if (id != -1)
3153 {
3154 map._plDay.Add(id);
3155 }
3156 }
3157 }
3158 UnityEngine.Object.DestroyImmediate(map.plDay);
3159 map.plDay = null;
3160 RefreshPlaylist();
3161 if (!refresh)
3162 {
3163 return;
3164 }
3165 if (fadeDuration > 0f)
3166 {
3167 EClass.
Sound.StopBGM(fadeDuration, playLastBGM:
false, delegate
3168 {
3170 {
3171 RefreshBGM();
3172 }
3173 });
3174 }
3175 else
3176 {
3178 RefreshBGM();
3179 }
3180 }
3181
3182 public void SetBGM(int id = -1, bool refresh = true, float fadeDuration = 0f)
3183 {
3184 SetBGM(new List<int> { id }, refresh, fadeDuration);
3185 }
3186
3187 public void RefreshPlaylist()
3188 {
3189 if (map.plDay == null)
3190 {
3191 map.plDay = CreatePlaylist(ref map._plDay,
EClass.
Sound.GetPlaylist(IDPlayList));
3192 }
3193 }
3194
3195 public void ResetPlaylist()
3196 {
3197 map._plDay.Clear();
3198 UnityEngine.Object.DestroyImmediate(map.plDay);
3199 map.plDay = null;
3200 RefreshPlaylist();
3201 }
3202
3203 public void RefreshBGM()
3204 {
3206 {
3207 return;
3208 }
3209 RefreshPlaylist();
3210 Playlist playlist = map.plDay;
3212 {
3213 if (
item.playlist !=
null)
3214 {
3215 playlist =
item.playlist;
3216 }
3217 }
3218 if (IDPlaylistOverwrite != null)
3219 {
3220 playlist =
EClass.
Sound.GetPlaylist(IDPlaylistOverwrite);
3221 }
3223 {
3225 if (room !=
null && room.
lot !=
null && room.
lot.
idBGM != 0)
3226 {
3228 if (playlist.list[0].data?.id != room.
lot.
idBGM)
3229 {
3231 playlist.Reset();
3233 {
3235 }
3236 }
3237 }
3238 }
3241 }
3242
3243 public Playlist CreatePlaylist(ref List<int> list, Playlist mold = null)
3244 {
3245 return ModUtil.CreatePlaylist(ref list, mold);
3246 }
3247
3248 public Chara FindChara(
string id)
3249 {
3250 return map.charas.Find((
Chara c) => c.
id ==
id);
3251 }
3252
3253 public Chara FindChara(
int uid)
3254 {
3255 return map.charas.Find((
Chara c) => c.
uid == uid);
3256 }
3257
3258 public int GetDeepestLv()
3259 {
3260 int max = base.lv;
3261 return GetDeepestLv(ref max);
3262 }
3263
3264 public int GetDeepestLv(ref int max)
3265 {
3266 if (Mathf.Abs(base.lv) > Mathf.Abs(max))
3267 {
3268 max = base.lv;
3269 }
3270 foreach (
Spatial child
in children)
3271 {
3272 (child as
Zone).GetDeepestLv(ref max);
3273 }
3274 return max;
3275 }
3276
3277 public List<Element> ListLandFeats()
3278 {
3279 if (landFeats == null)
3280 {
3281 landFeats = new List<int>();
3283 string[] listBase = IDBaseLandFeat.Split(',');
3284 string[] array = listBase;
3285 foreach (string text in array)
3286 {
3287 if (!text.IsEmpty())
3288 {
3290 }
3291 }
3292 if (listBase.Length == 1)
3293 {
3295 {
3296 if (e.category != "landfeat" || e.chance == 0)
3297 {
3298 return false;
3299 }
3300 bool flag = true;
3301 string[] tag = e.tag;
3302 foreach (string text2 in tag)
3303 {
3304 if (text2.StartsWith("bf"))
3305 {
3306 flag = false;
3307 if (listBase[0] == text2)
3308 {
3309 flag = true;
3310 break;
3311 }
3312 }
3313 }
3314 return flag ? true : false;
3315 }).ToList();
3317 landFeats.Add(row.
id);
3318 list.Remove(row);
3320 landFeats.Add(row.
id);
3321 }
3323 }
3324 List<Element> list2 = new List<Element>();
3325 foreach (int landFeat in landFeats)
3326 {
3328 }
3329 return list2;
3330 }
3331
3333 {
3334 ZipFile zipFile = ZipFile.Read(path);
3335 zipFile.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
3336 zipFile.ExtractAll(pathTemp);
3337 zipFile.Dispose();
3339 }
3340
3341 public void Export(
string path,
PartialMap partial =
null,
bool usermap =
false)
3342 {
3343 if (subset != null)
3344 {
3345 SE.Beep();
3346 return;
3347 }
3348 try
3349 {
3351 {
3352 name = name,
3353 usermap = usermap
3354 };
3356 if (!map.config.retainDecal)
3357 {
3358 map.ClearRainAndDecal();
3359 }
3360 map.Save(
IO.
TempPath +
"/", zoneExportData, partial);
3361 map.ExportMetaData(
IO.
TempPath +
"/", Path.GetFileNameWithoutExtension(path), partial);
3362 if (partial == null)
3363 {
3365 }
3367 using (ZipFile zipFile = new ZipFile())
3368 {
3369 zipFile.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
3371 zipFile.Save(path);
3372 zipFile.Dispose();
3373 }
3375 }
3376 catch (Exception ex)
3377 {
3378 EClass.
ui.Say(ex.Message +
":" + path);
3379 }
3380 }
3381
3382 public void ExportDialog(string dir = null)
3383 {
3385 {
3387 if (!
string.IsNullOrEmpty(text))
3388 {
3389 Export(text);
3391 }
3392 });
3393 }
3394
3395 public void ImportDialog(string dir = null)
3396 {
3398 {
3400 if (array.Length != 0)
3401 {
3402 Zone_User zone_User = SpatialGen.Create("user", EClass.world.region, register: true) as Zone_User;
3403 zone_User.path = array[0];
3404 Thing thing = ThingGen.Create("teleporter");
3405 thing.c_uidZone = zone_User.uid;
3406 EClass._zone.AddCard(thing, EClass.pc.pos);
3407 }
3408 });
3409 }
3410
3411 public static bool IsImportValid(string path)
3412 {
3413 try
3414 {
3416 }
3417 catch (Exception ex)
3418 {
3420 return false;
3421 }
3422 }
3423
3424 public void Export()
3425 {
3427 string text = pathExport;
3429 Export(text);
3430 Msg.
Say(
"Exported Map:" + text);
3431 }
3432
3434 {
3435 }
3436
3437 public void OnInspect()
3438 {
3439 }
3440
3441 public int GetSortVal()
3442 {
3443 if (IsPCFaction)
3444 {
3445 return -10000000 + base.uid;
3446 }
3448 {
3449 return -8000000 + base.uid;
3450 }
3452 {
3453 return -9000000 + base.uid;
3454 }
3456 {
3457 return -7000000 + base.uid;
3458 }
3460 {
3461 return 1000000 + base.uid;
3462 }
3463 return base.uid;
3464 }
3465
3466 public Chara AddRandomVisitor(
bool guest =
false)
3467 {
3469 if (random == null)
3470 {
3471 return null;
3472 }
3476 {
3479 if (chara != null)
3480 {
3481 AddCard(chara, point);
3482 Msg.
Say(
"guestArrive", chara);
3484 }
3485 }
3486 else
3487 {
3489 AddCard(chara, point);
3491 }
3492 return chara;
3493 }
3494
3496 {
3497 if (base.IsPlayerFaction)
3498 {
3500 }
3501 events.OnSimulateHour();
3503 {
3505 {
3507 {
3509 }
3510 }
3512 }
3514 {
3516 });
3517 foreach (
Thing sucker
in Suckers)
3518 {
3520 }
3521 Suckers.Clear();
3522 if (RespawnRate != 0f)
3523 {
3524 int num = 0;
3525 foreach (
Chara chara
in map.charas)
3526 {
3528 {
3529 num++;
3530 }
3531 }
3532 if (num < MaxRespawn)
3533 {
3534 for (int i = 0; i < RespawnPerHour; i++)
3535 {
3536 SpawnMob();
3537 }
3538 }
3539 }
3541 {
3542 RainWater();
3543 }
3545 {
3546 GrowPlants(date);
3547 }
3548 }
3549
3551 {
3552 if (base.IsPlayerFaction)
3553 {
3554 branch.OnSimulateDay(date);
3555 }
3556 }
3557
3559 {
3560 if (base.IsPlayerFaction)
3561 {
3562 branch.OnSimulateMonth(date);
3563 }
3565 {
3567 }
3568 }
3569
3570 public void RainWater()
3571 {
3573 {
3574 return;
3575 }
3577 {
3579 {
3580 c.isWatered = true;
3581 }
3582 });
3583 }
3584
3586 {
3588 int weedChance = 1;
3590 {
3592 }
3594 {
3596 }
3597 if (num)
3598 {
3599 HashSet<int> hashSet = new HashSet<int>();
3601 {
3603 {
3604 continue;
3605 }
3606 foreach (
Point item in traitSpotFarm.ListPoints(
null, onlyPassable:
false))
3607 {
3608 hashSet.Add(
item.index);
3609 }
3610 }
3611 Perform(hashSet);
3612 EClass.player.isAutoFarming = false;
3613 Perform(hashSet);
3614 }
3615 else
3616 {
3617 Perform(null);
3618 }
3619 void Perform(HashSet<int> farmMap)
3620 {
3623 {
3624 if (farmMap != null)
3625 {
3627 {
3628 if (!farmMap.Contains(c.index))
3629 {
3630 return;
3631 }
3632 }
3633 else if (farmMap.Contains(c.
index))
3634 {
3635 return;
3636 }
3637 }
3639 {
3640 c.decal = 0;
3641 }
3643 {
3645 {
3646 bool flag = false;
3647 if (!EClass.player.isAutoFarming && c.growth.HaltGrowth() && (c.IsFarmField || c.IsTopWater) && (!isWinter || !date.IsRealTime))
3648 {
3649 flag = true;
3650 }
3651 PlantData plantData = map.TryGetPlant(c);
3652 if (!flag && (plantData ==
null || plantData.fert >= 0))
3653 {
3654 c.TryGrow(date);
3655 }
3657 {
3658 if (date.sunMap == null)
3659 {
3660 date.BuildSunMap();
3661 }
3663 {
3664 c.growth.Perish();
3665 }
3666 }
3667 }
3668 else if (c.
detail !=
null)
3669 {
3670 c.Things.ForeachReverse(delegate(Thing t)
3671 {
3672 if (t.IsInstalled && t.trait is TraitSeed && !t.isSale)
3673 {
3674 (t.trait as TraitSeed).TrySprout(force: false, sucker: false, date);
3675 }
3676 });
3677 }
3679 {
3682 {
3684 }
3685 }
3686 }
3687 c.isWatered = false;
3688 });
3689 }
3690 }
3691
3692 public Zone GetZoneAt(
int _x,
int _y)
3693 {
3694 if (IsRegion)
3695 {
3696 foreach (
Spatial child
in children)
3697 {
3698 if (!(child is
Zone_Field) && _x == child.
x && _y == child.
y)
3699 {
3700 return child as
Zone;
3701 }
3702 }
3703 }
3704 foreach (
Spatial child2
in children)
3705 {
3706 if (_x == child2.
x && _y == child2.
y)
3707 {
3708 return child2 as
Zone;
3709 }
3710 }
3711 return null;
3712 }
3713
3714 public bool IsCrime(
Chara c,
Act act)
3715 {
3717 {
3718 return true;
3719 }
3720 return false;
3721 }
3722
3723 public void RefreshCriminal()
3724 {
3725 bool flag = EClass.player.IsCriminal && HasLaw && !AllowCriminal && !IsPCFaction;
3728 {
3730 {
3731 chara.hostility = hostility;
3733 {
3735 }
3736 }
3737 }
3738 }
3739
3740 public void RefreshListCitizen()
3741 {
3742 if (base.lv != 0)
3743 {
3744 return;
3745 }
3746 dictCitizen.Clear();
3747 foreach (
Chara item in map.charas.Concat(map.deadCharas))
3748 {
3749 if (
item.trait.IsCitizen && !
item.IsGlobal && !
item.isSubsetCard)
3750 {
3752 }
3753 }
3754 }
3755
3756 public virtual void SetAlarm(bool enable)
3757 {
3758 base.isAlarmSet = enable;
3759 if (enable)
3760 {
3762 {
3764 {
3766 }
3767 }
3770 SE.Play("alarm");
3771 return;
3772 }
3774 {
3776 {
3778 }
3779 }
3780 }
3781
3782 public void ModInfluence(int a)
3783 {
3784 base.influence += a;
3785 if (a > 0)
3786 {
3787 Msg.
Say(
"gainInfluence", Name, a.ToString() ??
"");
3788 }
3790 }
3791
3792 public void ModDevelopment(int a)
3793 {
3794 base.development += a;
3795 if (a > 0)
3796 {
3797 Msg.
Say(
"gainDevelopment", Name, a.ToString() ??
"");
3798 }
3799 }
3800
3801 public void UpdateQuests(bool force = false)
3802 {
3803 if (!IsPCFaction && (!(
this is
Zone_Town) || base.lv != 0))
3804 {
3805 return;
3806 }
3807 Debug.Log(
"Updating Quest:" + force);
3809 int num = 0;
3810 foreach (
Chara item in map.charas.Concat(map.deadCharas))
3811 {
3813 {
3814 if (
item.quest.IsExpired || completedQuests.Contains(
item.quest.uid) || force)
3815 {
3816 item.quest = null;
3817 }
3818 else
3819 {
3820 num++;
3821 }
3822 }
3823 }
3825 {
3826 return;
3827 }
3829 int maxQuest = 3;
3831 {
3832 maxQuest = 4 + EClass.rnd(4);
3833 });
3834 completedQuests.Clear();
3836 List<Tuple<string, int>> listTag = new List<Tuple<string, int>>();
3839 {
3840 array = new string[9] { "supply/8", "deliver/7", "food/8", "escort/4", "deliver/4", "monster/0", "war/0", "farm/0", "music/0" };
3841 }
3842 string[] array2 = array;
3843 for (int i = 0; i < array2.Length; i++)
3844 {
3845 string[] array3 = array2[i].Split('/');
3846 listTag.Add(new Tuple<string, int>(array3[0], array3[1].ToInt()));
3847 }
3848 for (int j = 0; j < map.charas.Count * 2; j++)
3849 {
3850 if (num > maxQuest)
3851 {
3852 break;
3853 }
3854 if (num > 15)
3855 {
3856 break;
3857 }
3858 Chara chara = map.charas.RandomItem();
3860 {
3861 continue;
3862 }
3864 {
3865 int num2 = 1;
3866 foreach (Tuple<string, int> item2 in listTag)
3867 {
3868 if (a.tags.Contains(item2.Item1))
3869 {
3870 num2 = item2.Item2;
3871 break;
3872 }
3873 }
3875 {
3876 num2 = 0;
3877 }
3878 return a.chance * num2;
3879 });
3881 {
3883 num++;
3884 }
3885 }
3886 }
3887
3888 public List<Chara> ListMinions(
Chara c)
3889 {
3890 List<Chara> list = new List<Chara>();
3892 {
3894 {
3895 list.Add(chara);
3896 }
3897 }
3898 return list;
3899 }
3900
3901 public int CountMinions(
Chara c)
3902 {
3903 int num = 0;
3905 {
3907 {
3908 num++;
3909 }
3910 }
3911 return num;
3912 }
3913
3914 public int GetSoilCost()
3915 {
3916 int i = 0;
3918 {
3920 });
3921 return i / 10;
3922 }
3923
3924 public void SpawnLostItems()
3925 {
3926 for (
int i = 0; i < 2 +
EClass.
rnd(4); i++)
3927 {
3928 Point point = GetPos();
3929 if (point == null)
3930 {
3931 continue;
3932 }
3934 {
3936 thing.isLostProperty = true;
3938 int num2 = (thing.c_lockLv =
EClass.
rndHalf(Mathf.Min(base.development / 10 + 10, 50)));
3941 {
3943 }
3944 else
3945 {
3947 }
3949 }
3950 else
3951 {
3953 }
3954 }
3955 static Point GetPos()
3956 {
3957 for (int j = 0; j < 10; j++)
3958 {
3961 {
3962 return randomPoint;
3963 }
3964 }
3965 return null;
3966 }
3967 }
3968
3969 public void ApplyBackerPet(bool draw)
3970 {
3971 bool flag =
this is
Zone_Yowyn && base.lv == -1;
3973 list.Shuffle();
3975 {
3977 {
3978 if (EClass.player.doneBackers.Contains(a.id))
3979 {
3980 list.Remove(a);
3981 }
3982 });
3983 }
3985 {
3987 {
3988 continue;
3989 }
3991 {
3993 {
3994 continue;
3995 }
3996 if (chara.
id !=
"follower")
3997 {
3999 }
4000 }
4002 {
4003 continue;
4004 }
4006 {
4007 if (
item.chara == chara.
id)
4008 {
4011 break;
4012 }
4013 }
4014 }
4015 }
4016
4017 public FortuneRollData GetOrCreateFortuneRollData(
bool refresh =
true)
4018 {
4019 if (fortuneRoll == null)
4020 {
4023 }
4024 if (refresh || fortuneRoll.count == 0)
4025 {
4026 fortuneRoll.Refresh();
4027 }
4028 return fortuneRoll;
4029 }
4030}
virtual void OnSimulatePosition()
void SimulateZone(int days)
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)
virtual void HealHP(int a, HealSource origin=HealSource.None)
Thing AddThing(string id, int lv=-1)
void DecayNatural(int hour=1)
Window.SaveData GetWindowSaveData()
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)
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 GetRaw(int offsetHours=0)
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)
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)
string Log(string idLang, string ref1=null, string ref2=null, string ref3=null, string ref4=null)
List< GodStatueData > godStatues
ReligionManager religions
ZoneTransition transition
void SetStage(int idx, bool renewHarvest=false)
virtual bool NeedSunlight
bool CanGrow(VirtualDate date)
static void CreateTempDirectory(string path=null)
static void DeleteDirectory(string path)
static void Copy(string fromPath, string toPath)
static void SaveFile(string path, object obj, bool compress=false, JsonSerializerSettings setting=null)
static void DeleteTempDirectory(string path=null)
static void CopyDir(string sourceDirectory, string targetDirectory, Func< string, bool > funcExclude=null)
static string[] GetList(string id)
static SourceMaterial.Row GetRandomMaterial(int lv, string group=null, bool tryLevelMatTier=false)
void ForeachCell(Action< Cell > action)
Point GetRandomSurface(int x, int z, int radius, bool walkable=true, bool allowWater=false)
Point GetRandomSpace(int width, int height, int tries=100)
Point GetRandomPoint(Point center, int radius, int tries=100, bool mustBeWalkable=true, bool requireLos=true)
PlantData AddPlant(Point pos, Thing seed)
static MapMetaData GetMetaData(string pathZip)
void RevealAll(bool reveal=true)
static string SayRaw(string text)
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
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)
Point Set(int _x, int _z)
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false, int minRadius=0)
void SetFloor(int idMat=0, int idFloor=0)
bool Equals(int _x, int _z)
bool ForeachNearestPoint(Func< Point, bool > endFunc, bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false, int maxRange=30)
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 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)
void RemoveActorEx(Card c)
Dictionary< string, CardRow > map
static SpawnList Get(string id, Func< SourceChara.Row, bool > func)
static SpawnList Get(string id, string parent=null, CardFilter filter=null)
CardRow Select(int lv=-1, int levelRange=-1)
static SpawnSetting Default
static SpawnSetting Fish()
static SpawnSetting HomeGuest(int lv)
static SpawnSetting Evolved(int fixedLv=-1)
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
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)
virtual List< Point > ListPoints(Point center=null, bool onlyPassable=true)
Point GetRandomPoint(Func< Point, bool > func=null, Chara accessChara=null)
virtual ShopType ShopType
string GetParam(int i, string def=null)
static void Reserve(string idStep, Action onBeforePlay=null)
FilterResult IsFilterPass(string text)
static ZoneProfile Load(string id)
Card AddThing(string id, int x, int z)
void SetBGM(List< int > ids, bool refresh=true, float fadeDuration=0f)
void ClearZones(Zone current=null)
Chara SpawnMob(string id, Point pos=null)
Card AddCard(Card t, Point point)
bool IsBelow(int _major, int _minor, int _batch)