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