Elin Decompiled Documentation EA 23.355 Stable
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 zone = _z as Zone;
34 if (zone.CanDestroy())
35 {
36 zone.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 TryAddZone("oldkeep");
94 elomap.objmap.UpdateMeshImmediate();
95 void TryAddZone(string id)
96 {
97 if (FindZone(id) == null)
98 {
99 SpatialGen.Create(id, this, register: true);
100 }
101 }
102 }
103
104 public void RenewRandomSites()
105 {
106 dateCheckSites = 0;
107 Msg.Say("renewNefia");
108 Debug.Log(ListRandomSites().Count);
109 foreach (Zone item in ListRandomSites())
110 {
111 item.dateExpire = 1;
112 }
113 }
114
115 public void UpdateRandomSites()
116 {
117 List<Zone> list = ListRandomSites();
118 int num = 70 - list.Count;
119 if (num <= 0)
120 {
121 return;
122 }
123 for (int i = 0; i < num; i++)
124 {
125 if (EClass.rnd(100) < 25)
126 {
127 CreateRandomSite(GetRandomPoint(ElomapSiteType.NefiaWater), "dungeon_water", updateMesh: false);
128 }
129 else
130 {
131 CreateRandomSite(GetRandomPoint(), null, updateMesh: false);
132 }
133 }
134 }
135
136 public void InitElomap()
137 {
139 }
140
141 public Zone CreateRandomSite(Zone center, int radius = 8, string idSource = null, bool updateMesh = true, int lv = 0)
142 {
143 InitElomap();
144 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);
145 if (elomap.IsWater(point.x, point.z))
146 {
147 return CreateRandomSite(GetRandomPoint(point.x, point.z, radius, increaseRadius: false, ElomapSiteType.NefiaWater), "dungeon_water", updateMesh, lv);
148 }
149 return CreateRandomSite(GetRandomPoint(point.x, point.z, radius), idSource, updateMesh, lv);
150 }
151
152 public Zone CreateRandomSite(Point pos, string idSource, bool updateMesh, int lv = 0)
153 {
154 if (pos == null)
155 {
156 return null;
157 }
158 if (idSource.IsEmpty())
159 {
160 idSource = GetRandomSiteSource().id;
161 }
162 Zone zone = SpatialGen.Create(idSource, this, register: true, pos.x, pos.z) as Zone;
163 if (lv <= 0)
164 {
165 if (EClass.player.CountKeyItem("license_adv") == 0 && !EClass.debug.enable)
166 {
167 lv = ((EClass.rnd(3) == 0) ? EClass.pc.LV : EClass.pc.FameLv) * (75 + EClass.rnd(50)) / 100 + EClass.rnd(EClass.rnd(10) + 1) - 3;
168 if (lv >= 50)
169 {
170 lv = EClass.rndHalf(50);
171 }
172 }
173 else
174 {
175 lv = EClass.pc.FameLv * 100 / (100 + EClass.rnd(50)) + EClass.rnd(EClass.rnd(10) + 1) - 3;
176 if (EClass.rnd(10) == 0)
177 {
178 lv = lv * 3 / 2;
179 }
180 if (EClass.rnd(10) == 0)
181 {
182 lv /= 2;
183 }
184 }
185 }
186 zone._dangerLv = Mathf.Max(1, lv);
187 zone.isRandomSite = true;
188 zone.dateExpire = EClass.world.date.GetRaw() + 10080;
189 if (elomap.IsSnow(zone.x, zone.y))
190 {
191 zone.icon++;
192 }
193 elomap.SetZone(zone.x, zone.y, zone);
194 if (updateMesh)
195 {
196 elomap.objmap.UpdateMeshImmediate();
197 }
198 return zone;
199 }
200
202 {
203 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);
204 }
205
207 {
208 Point point = new Point();
209 for (int i = 0; i < 1000; i++)
210 {
211 point = map.bounds.GetRandomPoint();
212 point.x += elomap.minX;
213 point.z += elomap.minY;
214 if (elomap.CanBuildSite(point.x, point.z, 1, type))
215 {
216 return point;
217 }
218 }
219 return null;
220 }
221
222 public Point GetRandomPoint(int orgX, int orgY, int radius = 8, bool increaseRadius = false, ElomapSiteType type = ElomapSiteType.Nefia)
223 {
224 Point point = new Point();
225 for (int i = 0; i < 1000; i++)
226 {
227 point.x = orgX + Rand.Range(-radius / 2, radius / 2);
228 point.z = orgY + Rand.Range(-radius / 2, radius / 2);
229 if (i % 100 == 0 && increaseRadius)
230 {
231 radius++;
232 }
233 if (elomap.CanBuildSite(point.x, point.z, 0, type))
234 {
235 return point;
236 }
237 }
238 return null;
239 }
240
241 public Point GetRandomPoint(int orgX, int orgY, int minRadius, int maxRadius)
242 {
243 Point point = new Point();
244 Point p = new Point(orgX, orgY);
245 for (int i = 0; i < 1000; i++)
246 {
247 point.x = orgX + Rand.Range(-maxRadius, maxRadius);
248 point.z = orgY + Rand.Range(-maxRadius, maxRadius);
249 if (point.Distance(p) >= minRadius && !point.IsBlocked && elomap.CanBuildSite(point.x + elomap.minX, point.z + elomap.minY, 0, ElomapSiteType.Mob))
250 {
251 return point;
252 }
253 }
254 return null;
255 }
256
257 public bool CanCreateZone(Point pos)
258 {
261 if (!tileInfo.idZoneProfile.IsEmpty())
262 {
263 return !tileInfo.blocked;
264 }
265 return false;
266 }
267
269 {
270 return SpatialGen.Create("field", this, register: true, pos.x, pos.z) as Zone;
271 }
272
273 public List<Zone> ListTowns()
274 {
275 List<Zone> list = new List<Zone>();
276 foreach (Spatial value in EClass.game.spatials.map.Values)
277 {
278 if (value != null && value.CanSpawnAdv)
279 {
280 list.Add(value as Zone);
281 }
282 }
283 return list;
284 }
285
287 {
288 List<Zone> list = ListTowns();
289 Zone zone = null;
290 for (int i = 0; i < 5; i++)
291 {
292 zone = list.RandomItem();
293 _ = zone is Zone_SubTown;
294 }
295 return zone;
296 }
297
298 public List<Zone> ListRandomSites()
299 {
300 return (from Zone a in children
301 where a.isRandomSite
302 select a).ToList();
303 }
304
305 public List<Zone> ListZonesInRadius(Zone center, int radius = 10)
306 {
307 List<Zone> list = new List<Zone>();
308 foreach (Zone zone in EClass.game.spatials.Zones)
309 {
310 if (zone.Dist(center) <= radius && zone != center && !(zone.source.parent != base.source.id))
311 {
312 list.Add(zone);
313 }
314 }
315 return list;
316 }
317
318 public List<Zone> ListTravelZones(int radius = 100)
319 {
320 bool isRegion = EClass.pc.currentZone.IsRegion;
321 List<Zone> list = new List<Zone>();
322 if (!isRegion)
323 {
325 }
326 else
327 {
328 _ = EClass.pc.pos;
329 }
330 foreach (Zone zone in EClass.game.spatials.Zones)
331 {
332 if (zone.CanFastTravel && !zone.IsInstance && (zone.isKnown || EClass.debug.returnAnywhere) && zone.parent == this)
333 {
334 list.Add(zone);
335 zone.tempDist = zone.Dist(EClass.pc.pos);
336 }
337 }
338 return list;
339 }
340
341 public override void OnAdvanceHour()
342 {
343 if (EClass.world.date.hour == 0)
344 {
345 foreach (Chara item in ListMobs())
346 {
347 if (item.Dist(EClass.pc) > 20 && EClass.rnd(2) == 0)
348 {
349 item.Destroy();
350 }
351 }
352 }
353 if (ListMobs().Count >= (EClass.debug.enable ? 100 : 6) || EClass.rnd(EClass.debug.enable ? 1 : 3) != 0)
354 {
355 return;
356 }
357 Point randomPoint = GetRandomPoint(EClass.pc.pos.x, EClass.pc.pos.z, 8, 14);
358 if (randomPoint != null)
359 {
360 RegionPoint regionPoint = new RegionPoint(EClass.pc.pos);
361 BiomeProfile biome = regionPoint.biome;
362 SpawnList list = ((biome.spawn.chara.Count <= 0) ? SpawnList.Get(biome.name, "chara", new CharaFilter
363 {
364 ShouldPass = (SourceChara.Row s) => s.biome == biome.name || s.biome.IsEmpty()
366 Chara chara = null;
367 chara = ((EClass.rnd(EClass.debug.enable ? 5 : 50) != 0) ? CharaGen.CreateFromFilter(list, regionPoint.dangerLv) : CharaGen.Create((EClass.rnd(5) == 0) ? "merchant_travel" : "merchant_travel2"));
368 if (chara != null && chara.rarity < Rarity.Legendary)
369 {
370 AddCard(chara, randomPoint);
371 }
372 }
373 }
374
375 public List<Chara> ListMobs()
376 {
377 List<Chara> list = new List<Chara>();
378 foreach (Chara chara in EClass._map.charas)
379 {
380 if (!chara.IsPCFactionOrMinion && !chara.IsGlobal)
381 {
382 list.Add(chara);
383 }
384 }
385 return list;
386 }
387
388 [OnDeserialized]
389 private void _OnDeserialized(StreamingContext context)
390 {
391 for (int num = children.Count - 1; num >= 0; num--)
392 {
393 if (!EClass.sources.zones.map.ContainsKey(children[num].id))
394 {
395 RemoveChild(children[num]);
396 }
397 }
398 }
399}
ElomapSiteType
Rarity
Definition: Rarity.cs:2
static AM_Region Region
Definition: ActionMode.cs:17
string GetRandomCharaId()
int FameLv
Definition: Card.cs:2368
bool IsPCFactionOrMinion
Definition: Card.cs:2342
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:630
Zone currentZone
Definition: Chara.cs:261
bool returnAnywhere
Definition: CoreDebug.cs:219
bool enable
Definition: CoreDebug.cs:302
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:88
List< Chara > charas
Definition: Map.cs:84
MapBounds bounds
Definition: Map.cs:55
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:2266
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:995
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:206
override bool IsRegion
Definition: Region.cs:21
void InitElomap()
Definition: Region.cs:136
SourceZone.Row GetRandomSiteSource()
Definition: Region.cs:201
EloMap elomap
Definition: Region.cs:9
void RenewRandomSites()
Definition: Region.cs:104
bool CanCreateZone(Point pos)
Definition: Region.cs:257
Point GetRandomPoint(int orgX, int orgY, int minRadius, int maxRadius)
Definition: Region.cs:241
override void OnAdvanceHour()
Definition: Region.cs:341
override bool BlockBorderExit
Definition: Region.cs:25
List< Chara > ListMobs()
Definition: Region.cs:375
void UpdateRandomSites()
Definition: Region.cs:115
override void OnActivate()
Definition: Region.cs:29
override ActionMode DefaultActionMode
Definition: Region.cs:19
List< Zone > ListTravelZones(int radius=100)
Definition: Region.cs:318
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:268
List< Zone > ListRandomSites()
Definition: Region.cs:298
Zone GetRandomTown()
Definition: Region.cs:286
void _OnDeserialized(StreamingContext context)
Definition: Region.cs:389
Zone CreateRandomSite(Zone center, int radius=8, string idSource=null, bool updateMesh=true, int lv=0)
Definition: Region.cs:141
List< Zone > ListZonesInRadius(Zone center, int radius=10)
Definition: Region.cs:305
List< Zone > ListTowns()
Definition: Region.cs:273
Zone CreateRandomSite(Point pos, string idSource, bool updateMesh, int lv=0)
Definition: Region.cs:152
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:222
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:1958
BiomeProfile biome
Definition: Zone.cs:134
bool IsInstance
Definition: Zone.cs:496
bool IsPCFaction
Definition: Zone.cs:480
Card AddCard(Card t, Point point)
Definition: Zone.cs:2159
Map map
Definition: Zone.cs:66