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