Elin Decompiled Documentation EA 23.306 Nightly
Loading...
Searching...
No Matches
Region.cs
Go to the documentation of this file.
1using System.Collections.Generic;
2using System.Linq;
3using System.Runtime.Serialization;
4using Newtonsoft.Json;
5using UnityEngine;
6
7public class Region : Zone
8{
9 public EloMap elomap = new EloMap();
10
11 [JsonProperty]
12 public int dateCheckSites;
13
14 [JsonProperty]
15 public bool beachFix;
16
17 public override bool WillAutoSave => false;
18
20
21 public override bool IsRegion => true;
22
23 public override int DangerLv => 1;
24
25 public override bool BlockBorderExit => true;
26
27 public override Point RegionPos => _regionPos.Set(EClass.pc.pos);
28
29 public override void OnActivate()
30 {
31 children.ForeachReverse(delegate(Spatial _z)
32 {
33 Zone zone2 = _z as Zone;
34 if (zone2.CanDestroy())
35 {
36 zone2.Destroy();
37 }
38 });
39 children.ForeachReverse(delegate(Spatial _z)
40 {
41 if (_z.destryoed)
42 {
43 children.Remove(_z);
44 }
45 });
46 children.ForEach(delegate(Spatial a)
47 {
48 Zone zone = a as Zone;
49 if (!zone.IsInstance && (zone.IsPCFaction || !(zone is Zone_Field)) && !(zone is Zone_SisterHouse))
50 {
51 elomap.SetZone(zone.x, zone.y, zone);
52 }
53 });
54 if (!beachFix)
55 {
56 Cell[,] cells = EClass._map.cells;
57 foreach (Cell cell in cells)
58 {
59 if (cell.blocked)
60 {
61 int gx = cell.x + EClass.scene.elomap.minX;
62 int gy = cell.z + EClass.scene.elomap.minY;
64 if (tileInfo != null && tileInfo.source != null && tileInfo.source.idBiome.IsEmpty("Plain") == "Sand")
65 {
66 cell.blocked = false;
67 cell.impassable = false;
68 }
69 }
70 }
71 beachFix = true;
72 }
74 }
75
76 public void CheckRandomSites()
77 {
79 {
82 }
83 TryAddZone("cave_fairy");
84 TryAddZone("foxtown_nefu");
85 TryAddZone("little_garden");
86 TryAddZone("cave_yeek");
87 TryAddZone("cave_dragon");
88 TryAddZone("cave_mino");
89 TryAddZone("village_exile");
90 TryAddZone("temple_undersea");
91 TryAddZone("curryruin");
92 TryAddZone("cave_dead");
93 elomap.objmap.UpdateMeshImmediate();
94 void TryAddZone(string id)
95 {
96 if (FindZone(id) == null)
97 {
98 SpatialGen.Create(id, this, register: true);
99 }
100 }
101 }
102
103 public void RenewRandomSites()
104 {
105 dateCheckSites = 0;
106 Msg.Say("renewNefia");
107 Debug.Log(ListRandomSites().Count);
108 foreach (Zone item in ListRandomSites())
109 {
110 item.dateExpire = 1;
111 }
112 }
113
114 public void UpdateRandomSites()
115 {
116 List<Zone> list = ListRandomSites();
117 int num = 70 - list.Count;
118 if (num <= 0)
119 {
120 return;
121 }
122 for (int i = 0; i < num; i++)
123 {
124 if (EClass.rnd(100) < 25)
125 {
126 CreateRandomSite(GetRandomPoint(ElomapSiteType.NefiaWater), "dungeon_water", updateMesh: false);
127 }
128 else
129 {
130 CreateRandomSite(GetRandomPoint(), null, updateMesh: false);
131 }
132 }
133 }
134
135 public void InitElomap()
136 {
138 }
139
140 public Zone CreateRandomSite(Zone center, int radius = 8, string idSource = null, bool updateMesh = true, int lv = 0)
141 {
142 InitElomap();
143 Point point = new Point(center.IsRegion ? (EClass.pc.pos.x + EClass.scene.elomap.minX) : center.x, center.IsRegion ? (EClass.pc.pos.z + EClass.scene.elomap.minY) : center.y);
144 if (elomap.IsWater(point.x, point.z))
145 {
146 return CreateRandomSite(GetRandomPoint(point.x, point.z, radius, increaseRadius: false, ElomapSiteType.NefiaWater), "dungeon_water", updateMesh, lv);
147 }
148 return CreateRandomSite(GetRandomPoint(point.x, point.z, radius), idSource, updateMesh, lv);
149 }
150
151 private Zone CreateRandomSite(Point pos, string idSource, bool updateMesh, int lv = 0)
152 {
153 if (pos == null)
154 {
155 return null;
156 }
157 if (idSource.IsEmpty())
158 {
159 idSource = GetRandomSiteSource().id;
160 }
161 Zone zone = SpatialGen.Create(idSource, this, register: true, pos.x, pos.z) as Zone;
162 if (lv <= 0)
163 {
164 if (EClass.player.CountKeyItem("license_adv") == 0 && !EClass.debug.enable)
165 {
166 lv = ((EClass.rnd(3) == 0) ? EClass.pc.LV : EClass.pc.FameLv) * (75 + EClass.rnd(50)) / 100 + EClass.rnd(EClass.rnd(10) + 1) - 3;
167 if (lv >= 50)
168 {
169 lv = EClass.rndHalf(50);
170 }
171 }
172 else
173 {
174 lv = EClass.pc.FameLv * 100 / (100 + EClass.rnd(50)) + EClass.rnd(EClass.rnd(10) + 1) - 3;
175 if (EClass.rnd(10) == 0)
176 {
177 lv = lv * 3 / 2;
178 }
179 if (EClass.rnd(10) == 0)
180 {
181 lv /= 2;
182 }
183 }
184 }
185 zone._dangerLv = Mathf.Max(1, lv);
186 zone.isRandomSite = true;
187 zone.dateExpire = EClass.world.date.GetRaw() + 10080;
188 if (elomap.IsSnow(zone.x, zone.y))
189 {
190 zone.icon++;
191 }
192 elomap.SetZone(zone.x, zone.y, zone);
193 if (updateMesh)
194 {
195 elomap.objmap.UpdateMeshImmediate();
196 }
197 return zone;
198 }
199
201 {
202 return EClass.sources.zones.rows.Where((SourceZone.Row a) => a.tag.Contains("random") && (EClass.debug.enable || !a.tag.Contains("debug"))).ToList().RandomItemWeighted((SourceZone.Row a) => a.chance);
203 }
204
206 {
207 Point point = new Point();
208 for (int i = 0; i < 1000; i++)
209 {
210 point = map.bounds.GetRandomPoint();
211 point.x += elomap.minX;
212 point.z += elomap.minY;
213 if (elomap.CanBuildSite(point.x, point.z, 1, type))
214 {
215 return point;
216 }
217 }
218 return null;
219 }
220
221 public Point GetRandomPoint(int orgX, int orgY, int radius = 8, bool increaseRadius = false, ElomapSiteType type = ElomapSiteType.Nefia)
222 {
223 Point point = new Point();
224 for (int i = 0; i < 1000; i++)
225 {
226 point.x = orgX + Rand.Range(-radius / 2, radius / 2);
227 point.z = orgY + Rand.Range(-radius / 2, radius / 2);
228 if (i % 100 == 0 && increaseRadius)
229 {
230 radius++;
231 }
232 if (elomap.CanBuildSite(point.x, point.z, 0, type))
233 {
234 return point;
235 }
236 }
237 return null;
238 }
239
240 public Point GetRandomPoint(int orgX, int orgY, int minRadius, int maxRadius)
241 {
242 Point point = new Point();
243 Point p = new Point(orgX, orgY);
244 for (int i = 0; i < 1000; i++)
245 {
246 point.x = orgX + Rand.Range(-maxRadius, maxRadius);
247 point.z = orgY + Rand.Range(-maxRadius, maxRadius);
248 if (point.Distance(p) >= minRadius && !point.IsBlocked && elomap.CanBuildSite(point.x + elomap.minX, point.z + elomap.minY, 0, ElomapSiteType.Mob))
249 {
250 return point;
251 }
252 }
253 return null;
254 }
255
256 public bool CanCreateZone(Point pos)
257 {
260 if (!tileInfo.idZoneProfile.IsEmpty())
261 {
262 return !tileInfo.blocked;
263 }
264 return false;
265 }
266
268 {
269 return SpatialGen.Create("field", this, register: true, pos.x, pos.z) as Zone;
270 }
271
272 public List<Zone> ListTowns()
273 {
274 List<Zone> list = new List<Zone>();
275 foreach (Spatial value in EClass.game.spatials.map.Values)
276 {
277 if (value != null && value.CanSpawnAdv)
278 {
279 list.Add(value as Zone);
280 }
281 }
282 return list;
283 }
284
286 {
287 List<Zone> list = ListTowns();
288 Zone zone = null;
289 for (int i = 0; i < 5; i++)
290 {
291 zone = list.RandomItem();
292 _ = zone is Zone_SubTown;
293 }
294 return zone;
295 }
296
297 public List<Zone> ListRandomSites()
298 {
299 return (from Zone a in children
300 where a.isRandomSite
301 select a).ToList();
302 }
303
304 public List<Zone> ListZonesInRadius(Zone center, int radius = 10)
305 {
306 List<Zone> list = new List<Zone>();
307 foreach (Zone zone in EClass.game.spatials.Zones)
308 {
309 if (zone.Dist(center) <= radius && zone != center && !(zone.source.parent != base.source.id))
310 {
311 list.Add(zone);
312 }
313 }
314 return list;
315 }
316
317 public List<Zone> ListTravelZones(int radius = 100)
318 {
319 bool isRegion = EClass.pc.currentZone.IsRegion;
320 List<Zone> list = new List<Zone>();
321 if (!isRegion)
322 {
324 }
325 else
326 {
327 _ = EClass.pc.pos;
328 }
329 foreach (Zone zone in EClass.game.spatials.Zones)
330 {
331 if (zone.CanFastTravel && !zone.IsInstance && (zone.isKnown || EClass.debug.returnAnywhere) && zone.parent == this)
332 {
333 list.Add(zone);
334 zone.tempDist = zone.Dist(EClass.pc.pos);
335 }
336 }
337 return list;
338 }
339
340 public override void OnAdvanceHour()
341 {
342 if (EClass.world.date.hour == 0)
343 {
344 foreach (Chara item in ListMobs())
345 {
346 if (item.Dist(EClass.pc) > 20 && EClass.rnd(2) == 0)
347 {
348 item.Destroy();
349 }
350 }
351 }
352 if (ListMobs().Count >= (EClass.debug.enable ? 100 : 6) || EClass.rnd(EClass.debug.enable ? 1 : 3) != 0)
353 {
354 return;
355 }
356 Point randomPoint = GetRandomPoint(EClass.pc.pos.x, EClass.pc.pos.z, 8, 14);
357 if (randomPoint != null)
358 {
359 RegionPoint regionPoint = new RegionPoint(EClass.pc.pos);
360 BiomeProfile biome = regionPoint.biome;
361 SpawnList list = ((biome.spawn.chara.Count <= 0) ? SpawnList.Get(biome.name, "chara", new CharaFilter
362 {
363 ShouldPass = (SourceChara.Row s) => s.biome == biome.name || s.biome.IsEmpty()
365 Chara chara = null;
366 chara = ((EClass.rnd(EClass.debug.enable ? 5 : 50) != 0) ? CharaGen.CreateFromFilter(list, regionPoint.dangerLv) : CharaGen.Create((EClass.rnd(5) == 0) ? "merchant_travel" : "merchant_travel2"));
367 if (chara != null && chara.rarity < Rarity.Legendary)
368 {
369 AddCard(chara, randomPoint);
370 }
371 }
372 }
373
374 public List<Chara> ListMobs()
375 {
376 List<Chara> list = new List<Chara>();
377 foreach (Chara chara in EClass._map.charas)
378 {
379 if (!chara.IsPCFactionOrMinion && !chara.IsGlobal)
380 {
381 list.Add(chara);
382 }
383 }
384 return list;
385 }
386
387 [OnDeserialized]
388 private void _OnDeserialized(StreamingContext context)
389 {
390 for (int num = children.Count - 1; num >= 0; num--)
391 {
392 if (!EClass.sources.zones.map.ContainsKey(children[num].id))
393 {
394 RemoveChild(children[num]);
395 }
396 }
397 }
398}
ElomapSiteType
Rarity
Definition: Rarity.cs:2
static AM_Region Region
Definition: ActionMode.cs:17
string GetRandomCharaId()
int FameLv
Definition: Card.cs:2340
bool IsPCFactionOrMinion
Definition: Card.cs:2314
Rarity rarity
Definition: Card.cs:317
Point pos
Definition: Card.cs:60
int LV
Definition: Card.cs:389
Definition: Cell.cs:7
static Chara CreateFromFilter(string id, int lv=-1, int levelRange=-1)
Definition: CharaGen.cs:22
static Chara Create(string id, int lv=-1)
Definition: CharaGen.cs:17
Definition: Chara.cs:10
override bool IsGlobal
Definition: Chara.cs:624
Zone currentZone
Definition: Chara.cs:257
bool returnAnywhere
Definition: CoreDebug.cs:218
bool enable
Definition: CoreDebug.cs:301
int hour
Definition: Date.cs:74
int GetRaw(int offsetHours=0)
Definition: Date.cs:328
bool IsExpired(int time)
Definition: Date.cs:338
Definition: EClass.cs:6
static Game game
Definition: EClass.cs:9
static Scene scene
Definition: EClass.cs:31
static World world
Definition: EClass.cs:41
static Map _map
Definition: EClass.cs:19
static int rnd(long a)
Definition: EClass.cs:59
static SourceManager sources
Definition: EClass.cs:43
static int rndHalf(int a)
Definition: EClass.cs:97
static Player player
Definition: EClass.cs:13
static Chara pc
Definition: EClass.cs:15
static CoreDebug debug
Definition: EClass.cs:49
void Initialize(EloMap _elomap)
Definition: EloMapActor.cs:28
EloMap elomap
Definition: EloMapActor.cs:7
string idZoneProfile
Definition: EloMap.cs:68
bool blocked
Definition: EloMap.cs:34
SourceGlobalTile.Row source
Definition: EloMap.cs:52
Definition: EloMap.cs:8
int minX
Definition: EloMap.cs:112
void SetZone(int gx, int gy, Zone z, bool updateMesh=false)
Definition: EloMap.cs:234
STETilemap objmap
Definition: EloMap.cs:102
int minY
Definition: EloMap.cs:114
bool IsSnow(int gx, int gy)
Definition: EloMap.cs:434
bool CanBuildSite(int gx, int gy, int radius=0, ElomapSiteType type=ElomapSiteType.Nefia)
Definition: EloMap.cs:358
bool IsWater(int gx, int gy)
Definition: EloMap.cs:416
TileInfo GetTileInfo(int gx, int gy)
Definition: EloMap.cs:286
SpatialManager spatials
Definition: Game.cs:153
Point GetRandomPoint()
Definition: MapBounds.cs:97
Cell[,] cells
Definition: Map.cs:85
List< Chara > charas
Definition: Map.cs:81
MapBounds bounds
Definition: Map.cs:52
Definition: Msg.cs:5
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
int CountKeyItem(string alias)
Definition: Player.cs:2240
Definition: Point.cs:9
Point Set(int _x, int _z)
Definition: Point.cs:503
bool IsBlocked
Definition: Point.cs:363
int x
Definition: Point.cs:36
int z
Definition: Point.cs:39
int Distance(Point p)
Definition: Point.cs:990
Definition: Rand.cs:4
static int Range(int min, int max)
Definition: Rand.cs:49
BiomeProfile biome
Definition: RegionPoint.cs:9
Definition: Region.cs:8
Point GetRandomPoint(ElomapSiteType type=ElomapSiteType.Nefia)
Definition: Region.cs:205
override bool IsRegion
Definition: Region.cs:21
void InitElomap()
Definition: Region.cs:135
SourceZone.Row GetRandomSiteSource()
Definition: Region.cs:200
EloMap elomap
Definition: Region.cs:9
void RenewRandomSites()
Definition: Region.cs:103
bool CanCreateZone(Point pos)
Definition: Region.cs:256
Point GetRandomPoint(int orgX, int orgY, int minRadius, int maxRadius)
Definition: Region.cs:240
override void OnAdvanceHour()
Definition: Region.cs:340
override bool BlockBorderExit
Definition: Region.cs:25
List< Chara > ListMobs()
Definition: Region.cs:374
void UpdateRandomSites()
Definition: Region.cs:114
override void OnActivate()
Definition: Region.cs:29
override ActionMode DefaultActionMode
Definition: Region.cs:19
List< Zone > ListTravelZones(int radius=100)
Definition: Region.cs:317
int dateCheckSites
Definition: Region.cs:12
override bool WillAutoSave
Definition: Region.cs:17
bool beachFix
Definition: Region.cs:15
override Point RegionPos
Definition: Region.cs:27
override int DangerLv
Definition: Region.cs:23
Zone CreateZone(Point pos)
Definition: Region.cs:267
List< Zone > ListRandomSites()
Definition: Region.cs:297
Zone GetRandomTown()
Definition: Region.cs:285
void _OnDeserialized(StreamingContext context)
Definition: Region.cs:388
Zone CreateRandomSite(Zone center, int radius=8, string idSource=null, bool updateMesh=true, int lv=0)
Definition: Region.cs:140
List< Zone > ListZonesInRadius(Zone center, int radius=10)
Definition: Region.cs:304
List< Zone > ListTowns()
Definition: Region.cs:272
Zone CreateRandomSite(Point pos, string idSource, bool updateMesh, int lv=0)
Definition: Region.cs:151
void CheckRandomSites()
Definition: Region.cs:76
Point GetRandomPoint(int orgX, int orgY, int radius=8, bool increaseRadius=false, ElomapSiteType type=ElomapSiteType.Nefia)
Definition: Region.cs:221
EloMapActor elomapActor
Definition: Scene.cs:101
EloMap elomap
Definition: Scene.cs:149
SourceZone zones
static Spatial Create(string id, Spatial parent, bool register, int x=-99999, int y=-99999, int icon=0)
Definition: SpatialGen.cs:16
List< Zone > Zones
GlobalSpatialList map
int Dist(Point p)
Definition: Spatial.cs:779
int lv
Definition: Spatial.cs:142
virtual bool CanSpawnAdv
Definition: Spatial.cs:505
Spatial parent
Definition: Spatial.cs:10
int icon
Definition: Spatial.cs:82
virtual bool IsRegion
Definition: Spatial.cs:515
bool isKnown
Definition: Spatial.cs:346
Point _regionPos
Definition: Spatial.cs:55
SourceZone.Row source
Definition: Spatial.cs:453
bool destryoed
Definition: Spatial.cs:45
virtual bool CanFastTravel
Definition: Spatial.cs:518
int y
Definition: Spatial.cs:106
int x
Definition: Spatial.cs:94
List< Spatial > children
Definition: Spatial.cs:37
Zone FindZone(int lv)
Definition: Spatial.cs:728
static SpawnList Get(string id, string parent=null, CardFilter filter=null)
Definition: SpawnList.cs:18
Region region
Definition: World.cs:23
GameDate date
Definition: World.cs:6
Definition: Zone.cs:12
bool CanDestroy()
Definition: Zone.cs:1822
BiomeProfile biome
Definition: Zone.cs:129
bool IsInstance
Definition: Zone.cs:491
bool IsPCFaction
Definition: Zone.cs:475
Card AddCard(Card t, Point point)
Definition: Zone.cs:2017
Map map
Definition: Zone.cs:63