Elin Decompiled Documentation EA 23.326 Nightly
Loading...
Searching...
No Matches
Map.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using System.Runtime.Serialization;
6using Algorithms;
7using FloodSpill;
8using Ionic.Zip;
9using Newtonsoft.Json;
10using UnityEngine;
11
13{
14 public static HashSet<int> sunMap = new HashSet<int>();
15
16 public static bool isDirtySunMap;
17
18 [JsonProperty]
19 public int seed;
20
21 [JsonProperty]
22 public int _bits;
23
24 [JsonProperty]
26
27 [JsonProperty]
29
30 [JsonProperty]
32
33 [JsonProperty]
35
36 [JsonProperty]
37 public MapConfig config = new MapConfig();
38
39 [JsonProperty]
41
42 [JsonProperty]
43 public List<Chara> serializedCharas = new List<Chara>();
44
45 [JsonProperty]
46 public List<Chara> deadCharas = new List<Chara>();
47
48 [JsonProperty]
49 public List<Thing> things = new List<Thing>();
50
51 [JsonProperty]
52 public MapBounds bounds = new MapBounds();
53
54 [JsonProperty]
55 public List<int> _plDay = new List<int>();
56
57 [JsonProperty]
58 public List<int> _plNight = new List<int>();
59
60 [JsonProperty]
61 public Dictionary<int, int> gatherCounts = new Dictionary<int, int>();
62
63 [JsonProperty]
64 public Dictionary<int, CellEffect> cellEffects = new Dictionary<int, CellEffect>();
65
66 [JsonProperty]
67 public Dictionary<int, int> backerObjs = new Dictionary<int, int>();
68
69 [JsonProperty]
70 public Dictionary<int, PlantData> plants = new Dictionary<int, PlantData>();
71
72 [JsonProperty]
74
76
77 public Playlist plDay;
78
79 public Playlist plNight;
80
81 public List<Chara> charas = new List<Chara>();
82
83 public List<TransAnime> pointAnimes = new List<TransAnime>();
84
85 public Cell[,] cells;
86
87 public Zone zone;
88
90
92
93 public FloodSpiller flood = new FloodSpiller();
94
96
97 public POIMap poiMap;
98
99 public List<Footmark> footmarks = new List<Footmark>();
100
102
103 public bool revealed;
104
105 private HashSet<int> roomHash = new HashSet<int>();
106
107 private List<Thing> _things = new List<Thing>();
108
109 public bool isBreakerDown
110 {
111 get
112 {
113 return bits[0];
114 }
115 set
116 {
117 bits[0] = value;
118 }
119 }
120
122
124
126
127 public float sizeModifier => 1f / (16384f / (float)SizeXZ);
128
129 public bool isGenerated => Size != 0;
130
131 public bool IsIndoor => config.indoor;
132
133 public int SizeXZ => Size * Size;
134
135 public IEnumerable<Card> Cards => ((IEnumerable<Card>)things).Concat((IEnumerable<Card>)charas);
136
138 private void OnSerializing(StreamingContext context)
139 {
140 _bits = (int)bits.Bits;
141 }
142
143 protected virtual void OnSerializing()
144 {
145 }
146
148 private void OnDeserialized(StreamingContext context)
149 {
150 bits.Bits = (uint)_bits;
151 }
152
153 public void CreateNew(int size, bool setReference = true)
154 {
155 Debug.Log("Map CreateNew:");
156 Size = size;
157 cells = new Cell[Size, Size];
158 bounds = new MapBounds
159 {
160 x = 0,
161 z = 0,
162 maxX = Size - 1,
163 maxZ = Size - 1,
164 Size = Size
165 };
166 SetBounds(0, 0, Size - 1, Size - 1);
167 ForeachXYZ(delegate(int x, int z)
168 {
169 cells[x, z] = new Cell
170 {
171 x = (byte)x,
172 z = (byte)z
173 };
174 });
175 if (setReference)
176 {
177 SetReference();
178 }
179 }
180
181 public void SetZone(Zone _zone)
182 {
183 zone = _zone;
184 zone.bounds = bounds;
185 bounds.Size = Size;
186 SetReference();
187 props.Init();
188 EClass.scene.profile = SceneProfile.Load(config.idSceneProfile.IsEmpty("default"));
189 if (!config.idFowProfile.IsEmpty())
190 {
192 }
193 }
194
195 public void SetReference()
196 {
197 Fov.map = (Cell.map = (Wall.map = (Point.map = (CellDetail.map = this))));
198 Cell.Size = Size;
199 Cell.cells = cells;
201 WeightCell[,] weightMap = cells;
202 pathfinder.Init(this, weightMap, Size);
203 }
204
205 public void OnDeactivate()
206 {
207 charas.ForeachReverse(delegate(Chara c)
208 {
209 c.ai = new NoGoal();
210 if (c.IsGlobal)
211 {
212 zone.RemoveCard(c);
213 c.currentZone = zone;
214 }
215 });
216 foreach (Thing thing in things)
217 {
218 if (thing.renderer.hasActor)
219 {
220 thing.renderer.KillActor();
221 }
222 }
224 }
225
226 public void Resize(int newSize)
227 {
228 Point p = new Point(0, 0);
229 foreach (Thing thing in EClass._map.things)
230 {
231 if (thing.pos.x >= newSize || thing.pos.z >= newSize)
232 {
233 MoveCard(p, thing);
234 }
235 }
236 foreach (Chara chara in EClass._map.charas)
237 {
238 if (chara.pos.x >= newSize || chara.pos.z >= newSize)
239 {
240 MoveCard(p, chara);
241 }
242 }
243 Size = (bounds.Size = newSize);
244 maxX = (maxZ = Size);
245 cells = Util.ResizeArray(EClass._map.cells, newSize, newSize, (int x, int y) => new Cell
246 {
247 x = (byte)x,
248 z = (byte)y,
249 isSeen = true
250 });
251 Reload();
252 }
253
254 public void Shift(Vector2Int offset)
255 {
256 TweenUtil.Tween(0.1f, null, delegate
257 {
258 foreach (Card item in ((IEnumerable<Card>)EClass._map.things).Concat((IEnumerable<Card>)EClass._map.charas))
259 {
260 item.pos.x += offset.x;
261 item.pos.z += offset.y;
262 item.pos.Clamp();
263 }
264 Cell[,] array = new Cell[Size, Size];
265 for (int i = 0; i < Size; i++)
266 {
267 int num = i - offset.y;
268 for (int j = 0; j < Size; j++)
269 {
270 int num2 = j - offset.x;
271 if (num2 >= 0 && num2 < Size && num >= 0 && num < Size)
272 {
273 array[j, i] = cells[num2, num];
274 }
275 else
276 {
277 array[j, i] = new Cell
278 {
279 x = (byte)j,
280 z = (byte)i
281 };
282 }
283 }
284 }
285 cells = array;
286 bounds.x += offset.x;
287 bounds.z += offset.y;
288 bounds.maxX += offset.x;
289 bounds.maxZ += offset.y;
290 if (bounds.x < 0)
291 {
292 bounds.x = 0;
293 }
294 if (bounds.z < 0)
295 {
296 bounds.z = 0;
297 }
298 if (bounds.maxX > Size)
299 {
300 bounds.maxX = Size;
301 }
302 if (bounds.maxZ > Size)
303 {
304 bounds.maxZ = Size;
305 }
306 Reload();
307 });
308 }
309
310 public void Reload()
311 {
312 rooms = new RoomManager();
313 SetReference();
314 string id = Game.id;
315 EClass.game.Save();
316 EClass.scene.Init(Scene.Mode.None);
317 Game.Load(id, cloud: false);
318 RevealAll();
319 TweenUtil.Tween(0.1f, null, delegate
320 {
321 ReloadRoom();
322 });
323 }
324
325 public void ReloadRoom()
326 {
327 List<Thing> list = new List<Thing>();
328 foreach (Thing thing in things)
329 {
330 if (thing.trait.IsDoor)
331 {
332 list.Add(thing);
333 }
334 }
335 foreach (Thing item in list)
336 {
337 Point pos = item.pos;
339 EClass._zone.AddCard(item, pos);
340 item.Install();
341 }
343 }
344
345 public void Reset()
346 {
347 for (int i = 0; i < Size; i++)
348 {
349 for (int j = 0; j < Size; j++)
350 {
351 cells[i, j].Reset();
352 }
353 }
354 SetReference();
355 }
356
357 public void ResetEditorPos()
358 {
360 foreach (Chara chara in charas)
361 {
362 if (chara.isPlayerCreation && chara.orgPos != null)
363 {
364 MoveCard(chara.orgPos, chara);
365 }
366 }
367 foreach (Thing thing in things)
368 {
369 if (thing.trait is TraitDoor)
370 {
371 (thing.trait as TraitDoor).ForceClose();
372 }
373 }
374 }
375
376 public void Save(string path, ZoneExportData export = null, PartialMap partial = null)
377 {
379 Debug.Log("#io saving map:" + path);
380 IO.CreateDirectory(path);
381 int num = 0;
382 int num2 = 0;
383 int num3 = Size;
384 int num4 = Size;
385 if (partial != null)
386 {
387 num = partial.offsetX;
388 num2 = partial.offsetZ;
389 num3 = partial.w;
390 num4 = partial.h;
391 }
392 int num5 = num3 * num4;
393 byte[] array = new byte[num5];
394 byte[] array2 = new byte[num5];
395 byte[] array3 = new byte[num5];
396 byte[] array4 = new byte[num5];
397 byte[] array5 = new byte[num5];
398 byte[] array6 = new byte[num5];
399 byte[] array7 = new byte[num5];
400 byte[] array8 = new byte[num5];
401 byte[] array9 = new byte[num5];
402 byte[] array10 = new byte[num5];
403 byte[] array11 = new byte[num5];
404 byte[] array12 = new byte[num5];
405 byte[] array13 = new byte[num5];
406 byte[] array14 = new byte[num5];
407 byte[] array15 = new byte[num5];
408 byte[] array16 = new byte[num5];
409 byte[] array17 = new byte[num5];
410 byte[] array18 = new byte[num5];
411 byte[] array19 = new byte[num5];
412 byte[] array20 = new byte[num5];
413 byte[] array21 = new byte[num5];
414 cellEffects.Clear();
415 int num6 = 0;
416 for (int i = num; i < num + num3; i++)
417 {
418 for (int j = num2; j < num2 + num4; j++)
419 {
420 Cell cell = cells[i, j];
421 array[num6] = cell.objVal;
422 array3[num6] = cell._blockMat;
423 array2[num6] = cell._block;
424 array5[num6] = cell._floorMat;
425 array4[num6] = cell._floor;
426 array6[num6] = cell.obj;
427 array20[num6] = cell._deco;
428 array21[num6] = cell._decoMat;
429 array7[num6] = cell.objMat;
430 array8[num6] = cell.decal;
431 array9[num6] = cell._dirs;
432 array12[num6] = cell.height;
433 array13[num6] = cell._bridge;
434 array14[num6] = cell._bridgeMat;
435 array15[num6] = cell.bridgeHeight;
436 array17[num6] = cell._roofBlockDir;
437 array18[num6] = cell._roofBlock;
438 array19[num6] = cell._roofBlockMat;
439 array16[num6] = cell.bridgePillar;
440 array10[num6] = array10[num6].SetBit(1, cell.isSeen);
441 array10[num6] = array10[num6].SetBit(2, cell.isHarvested);
442 array10[num6] = array10[num6].SetBit(3, cell.impassable);
443 array10[num6] = array10[num6].SetBit(4, cell.isModified);
444 array10[num6] = array10[num6].SetBit(5, cell.isClearSnow);
445 array10[num6] = array10[num6].SetBit(6, cell.isForceFloat);
446 array10[num6] = array10[num6].SetBit(7, cell.isToggleWallPillar);
447 array11[num6] = array11[num6].SetBit(0, cell.isWatered);
448 array11[num6] = array11[num6].SetBit(1, cell.isObjDyed);
449 array11[num6] = array11[num6].SetBit(2, cell.crossWall);
450 if (cell.effect != null)
451 {
452 cellEffects[j * num4 + i] = cell.effect;
453 }
454 num6++;
455 }
456 }
457 compression = ((!EClass.core.config.test.compressSave) ? IO.Compression.None : IO.Compression.LZ4);
458 Write(path + "objVals", array);
459 Write(path + "blocks", array2);
460 Write(path + "blockMats", array3);
461 Write(path + "floors", array4);
462 Write(path + "floorMats", array5);
463 Write(path + "objs", array6);
464 Write(path + "objMats", array7);
465 Write(path + "decal", array8);
466 Write(path + "flags", array10);
467 Write(path + "flags2", array11);
468 Write(path + "dirs", array9);
469 Write(path + "heights", array12);
470 Write(path + "bridges", array13);
471 Write(path + "bridgeMats", array14);
472 Write(path + "bridgeHeights", array15);
473 Write(path + "bridgePillars", array16);
474 Write(path + "roofBlocks", array18);
475 Write(path + "roofBlockMats", array19);
476 Write(path + "roofBlockDirs", array17);
477 Write(path + "decos", array20);
478 Write(path + "decoMats", array21);
479 things.Sort((Thing a, Thing b) => a.stackOrder - b.stackOrder);
480 if (export == null)
481 {
482 foreach (Chara chara in charas)
483 {
484 if (!chara.IsGlobal)
485 {
486 serializedCharas.Add(chara);
487 }
488 }
489 GameIO.SaveFile(path + "map", this);
490 }
491 else
492 {
493 export.serializedCards.cards.Clear();
494 if (partial == null)
495 {
496 MapExportSetting mapExportSetting = exportSetting ?? new MapExportSetting();
497 foreach (Chara chara2 in charas)
498 {
499 if (export.usermap)
500 {
501 if ((!mapExportSetting.clearLocalCharas || chara2.IsPCFactionOrMinion) && !chara2.trait.IsUnique && !chara2.IsPC)
502 {
503 export.serializedCards.Add(chara2);
504 }
505 }
506 else if (!chara2.IsGlobal && chara2.isPlayerCreation)
507 {
508 export.serializedCards.Add(chara2);
509 }
510 }
511 foreach (Thing thing in things)
512 {
513 if (thing.isPlayerCreation && thing.c_altName != "DebugContainer")
514 {
515 export.serializedCards.Add(thing);
516 }
517 }
518 }
519 else
520 {
521 foreach (Thing thing2 in things)
522 {
523 if ((ActionMode.Copy.IsActive || thing2.trait.CanCopyInBlueprint) && thing2.pos.x >= num && thing2.pos.z >= num2 && thing2.pos.x < num + num3 && thing2.pos.z < num2 + num4)
524 {
525 export.serializedCards.Add(thing2);
526 }
527 }
528 }
529 List<Thing> list = things;
530 things = new List<Thing>();
531 GameIO.SaveFile(path + "map", this);
532 things = list;
533 }
534 serializedCharas.Clear();
535 void Write(string _path, byte[] bytes)
536 {
537 IO.WriteLZ4(_path, bytes, compression);
538 }
539 }
540
541 public byte[] TryLoadFile(string path, string s, int size)
542 {
543 byte[] array = IO.ReadLZ4(path + s, size, compression);
544 if (array == null)
545 {
546 Debug.Log("Couldn't load:" + s);
547 return new byte[size];
548 }
549 return array;
550 }
551
552 public void Load(string path, bool import = false, PartialMap partial = null)
553 {
554 if (partial == null)
555 {
556 Debug.Log("Map Load:" + compression.ToString() + ": " + path);
557 }
558 int num = Size;
559 int num2 = Size;
560 if (partial != null)
561 {
562 num = partial.w;
563 num2 = partial.h;
564 Debug.Log(compression.ToString() + ": " + num + "/" + num2);
565 }
566 int size = num * num2;
567 cells = new Cell[num, num2];
568 if (bounds.maxX == 0)
569 {
570 bounds.SetBounds(0, 0, num - 1, num2 - 1);
571 }
572 SetBounds(0, 0, num - 1, num2 - 1);
573 byte[] bytes2 = TryLoad("objVals");
574 byte[] bytes3 = TryLoad("blockMats");
575 byte[] bytes4 = TryLoad("blocks");
576 byte[] bytes5 = TryLoad("floorMats");
577 byte[] bytes6 = TryLoad("floors");
578 byte[] bytes7 = TryLoad("objs");
579 byte[] bytes8 = TryLoad("objMats");
580 byte[] bytes9 = TryLoad("decal");
581 byte[] bytes10 = TryLoad("decos");
582 byte[] bytes11 = TryLoad("decoMats");
583 byte[] bytes12 = TryLoad("dirs");
584 byte[] bytes13 = TryLoad("flags");
585 byte[] bytes14 = TryLoad("flags2");
586 byte[] bytes15 = TryLoad("heights");
587 byte[] bytes16 = TryLoad("bridges");
588 byte[] bytes17 = TryLoad("bridgeMats");
589 byte[] bytes18 = TryLoad("bridgeHeights");
590 byte[] bytes19 = TryLoad("bridgePillars");
591 byte[] bytes20 = TryLoad("roofBlocks");
592 byte[] bytes21 = TryLoad("roofBlockMats");
593 byte[] bytes22 = TryLoad("roofBlockDirs");
594 if (bytes19.Length < size)
595 {
596 bytes19 = new byte[size];
597 }
598 if (bytes2.Length < size)
599 {
600 bytes2 = new byte[size];
601 }
602 if (bytes14.Length < size)
603 {
604 bytes14 = new byte[size];
605 }
606 Validate(ref bytes2, "objVals");
607 Validate(ref bytes3, "blockMats");
608 Validate(ref bytes4, "blocks");
609 Validate(ref bytes5, "floorMats");
610 Validate(ref bytes6, "floors");
611 Validate(ref bytes7, "objs");
612 Validate(ref bytes8, "objMats");
613 Validate(ref bytes9, "decal");
614 Validate(ref bytes10, "decos");
615 Validate(ref bytes11, "decoMats");
616 Validate(ref bytes12, "dirs");
617 Validate(ref bytes13, "flags");
618 Validate(ref bytes14, "flags2");
619 Validate(ref bytes15, "heights");
620 Validate(ref bytes16, "bridges");
621 Validate(ref bytes17, "bridgeMats");
622 Validate(ref bytes18, "bridgeHeights");
623 Validate(ref bytes19, "bridgePillars");
624 Validate(ref bytes20, "roofBlocks");
625 Validate(ref bytes21, "roofBlockMats");
626 Validate(ref bytes22, "roofBlockDirs");
627 int count = EClass.sources.floors.rows.Count;
628 int count2 = EClass.sources.materials.rows.Count;
629 int num3 = 0;
630 for (int i = 0; i < num; i++)
631 {
632 for (int j = 0; j < num2; j++)
633 {
634 Cell cell = (cells[i, j] = new Cell
635 {
636 x = (byte)i,
637 z = (byte)j,
638 objVal = bytes2[num3],
639 _blockMat = bytes3[num3],
640 _block = bytes4[num3],
641 _floorMat = bytes5[num3],
642 _floor = bytes6[num3],
643 obj = bytes7[num3],
644 objMat = bytes8[num3],
645 decal = bytes9[num3],
646 _deco = bytes10[num3],
647 _decoMat = bytes11[num3],
648 _dirs = bytes12[num3],
649 height = bytes15[num3],
650 _bridge = bytes16[num3],
651 _bridgeMat = bytes17[num3],
652 bridgeHeight = bytes18[num3],
653 bridgePillar = bytes19[num3],
654 _roofBlock = bytes20[num3],
655 _roofBlockMat = bytes21[num3],
656 _roofBlockDir = bytes22[num3],
657 isSeen = bytes13[num3].GetBit(1),
658 isHarvested = bytes13[num3].GetBit(2),
659 impassable = bytes13[num3].GetBit(3),
660 isModified = bytes13[num3].GetBit(4),
661 isClearSnow = bytes13[num3].GetBit(5),
662 isForceFloat = bytes13[num3].GetBit(6),
663 isToggleWallPillar = bytes13[num3].GetBit(7),
664 isWatered = bytes14[num3].GetBit(0),
665 isObjDyed = bytes14[num3].GetBit(1),
666 crossWall = bytes14[num3].GetBit(2)
667 });
668 if (cell._bridge >= count)
669 {
670 cell._bridge = 0;
671 }
672 if (cell._bridgeMat >= count2)
673 {
674 cell._bridgeMat = 1;
675 }
677 num3++;
678 }
679 }
680 things.ForeachReverse(delegate(Thing t)
681 {
682 if (t.Num <= 0 || t.isDestroyed)
683 {
684 Debug.Log("[bug] Removing bugged thing:" + t.Num + "/" + t.isDestroyed + "/" + t);
685 things.Remove(t);
686 }
687 });
688 foreach (KeyValuePair<int, CellEffect> cellEffect in cellEffects)
689 {
690 int key = cellEffect.Key;
691 int num4 = key % Size;
692 int num5 = key / Size;
693 cells[num4, num5].effect = cellEffect.Value;
694 if (cellEffect.Value.IsFire)
695 {
696 effectManager.GetOrCreate(new Point(num4, num5));
697 }
698 }
699 cellEffects.Clear();
701 byte[] TryLoad(string s)
702 {
703 return TryLoadFile(path, s, size);
704 }
705 void Validate(ref byte[] bytes, string id)
706 {
707 if (bytes.Length < size)
708 {
709 Debug.LogError("expection: size invalid:" + id + " " + bytes.Length + "/" + size);
710 bytes = new byte[size];
711 }
712 }
713 }
714
715 public void ValidateVersion()
716 {
718 }
719
720 public void OnLoad()
721 {
722 rooms.OnLoad();
723 tasks.OnLoad();
724 }
725
726 public void OnImport(ZoneExportData data)
727 {
728 tasks = new TaskManager();
729 data.serializedCards.Restore(this, data.orgMap, addToZone: false);
730 }
731
732 public void ExportMetaData(string _path, string id, PartialMap partial = null)
733 {
734 if (custom == null)
735 {
736 custom = new CustomData();
737 }
738 MapMetaData mapMetaData = new MapMetaData
739 {
740 name = EClass._zone.Name,
742 tag = (EClass._map.exportSetting?.tag ?? ""),
743 partial = partial,
744 underwater = EClass._zone.IsUnderwater
745 };
746 custom.id = (mapMetaData.id = id);
747 IO.SaveFile(_path + "meta", mapMetaData);
748 }
749
750 public static MapMetaData GetMetaData(string pathZip)
751 {
752 try
753 {
754 using ZipFile zipFile = ZipFile.Read(pathZip);
755 ZipEntry zipEntry = zipFile["meta"];
756 if (zipEntry != null)
757 {
758 using (MemoryStream stream = new MemoryStream())
759 {
760 zipEntry.Extract(stream);
761 MapMetaData mapMetaData = IO.LoadStreamJson<MapMetaData>(stream);
762 mapMetaData.path = pathZip;
763 return mapMetaData;
764 }
765 }
766 }
767 catch (Exception message)
768 {
769 if (Application.isEditor)
770 {
771 Debug.Log(message);
772 }
773 }
774 return null;
775 }
776
777 public static void UpdateMetaData(string pathZip, PartialMap partial = null)
778 {
779 IO.CreateTempDirectory();
780 ZipFile zipFile = ZipFile.Read(pathZip);
781 zipFile.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
782 zipFile.ExtractAll(IO.TempPath);
783 zipFile.Dispose();
784 EClass._map.ExportMetaData(IO.TempPath + "/", Path.GetFileNameWithoutExtension(pathZip), partial);
785 using (zipFile = new ZipFile())
786 {
787 zipFile.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently;
788 zipFile.AddDirectory(IO.TempPath);
789 zipFile.Save(pathZip);
790 zipFile.Dispose();
791 }
792 IO.DeleteTempDirectory();
793 }
794
795 public void AddCardOnActivate(Card c)
796 {
797 c.parent = zone;
799 Chara chara = c.Chara;
800 if (chara != null)
801 {
802 chara.currentZone = EClass._zone;
803 }
804 if (c.isChara)
805 {
806 if (!c.pos.IsInBounds)
807 {
809 }
810 }
811 else if (!c.pos.IsValid)
812 {
814 }
815 _AddCard(c.pos.x, c.pos.z, c, onAddToZone: true);
816 }
817
818 public void OnCardAddedToZone(Card t, int x, int z)
819 {
820 if (t.isChara)
821 {
822 charas.Add(t.Chara);
823 }
824 else
825 {
826 things.Add(t.Thing);
827 }
829 if (t.isChara && new Point(x, z).cell.HasFullBlock)
830 {
831 DestroyBlock(x, z);
832 }
833 _AddCard(x, z, t, onAddToZone: true);
835 }
836
838 {
841 _RemoveCard(t);
842 t.parent = null;
843 if (t.isChara)
844 {
845 charas.Remove(t.Chara);
846 }
847 else
848 {
849 things.Remove(t.Thing);
850 }
851 }
852
853 public void MoveCard(Point p, Card t)
854 {
855 _AddCard(p.x, p.z, t, onAddToZone: false);
856 }
857
858 public void _AddCard(int x, int z, Card t, bool onAddToZone)
859 {
860 if (!onAddToZone)
861 {
862 _RemoveCard(t);
863 }
864 t.lastPos.Set(t.pos);
865 t.pos.Set(x, z);
866 if (t.IsMultisize)
867 {
868 t.ForeachPoint(delegate(Point p, bool main)
869 {
870 p.cell.AddCard(t);
871 });
872 }
873 else
874 {
875 t.Cell.AddCard(t);
876 }
877 t.CalculateFOV();
878 if (t.isThing && !t.trait.IDActorEx.IsEmpty())
879 {
881 }
882 }
883
884 public void _RemoveCard(Card t)
885 {
886 if (t.IsMultisize)
887 {
888 t.ForeachPoint(delegate(Point p, bool main)
889 {
890 p.cell.RemoveCard(t);
891 });
892 }
893 else
894 {
895 t.Cell.RemoveCard(t);
896 }
897 t.ClearFOV();
898 }
899
900 public Cell GetCell(int index)
901 {
902 return cells[index % Size, index % SizeXZ / Size];
903 }
904
905 public void SetSeen(int x, int z, bool seen = true, bool refresh = true)
906 {
907 if (cells[x, z].isSeen != seen)
908 {
909 cells[x, z].isSeen = seen;
910 if (refresh)
911 {
913 }
915 }
916 }
917
918 public void RevealAll(bool reveal = true)
919 {
920 for (int i = 0; i < Size; i++)
921 {
922 for (int j = 0; j < Size; j++)
923 {
924 EClass._map.SetSeen(i, j, reveal, refresh: false);
925 }
926 }
929 }
930
931 public void Reveal(Point center, int power = 100)
932 {
933 ForeachSphere(center.x, center.z, 10 + power / 5, delegate(Point p)
934 {
935 if (EClass.rnd(power) >= Mathf.Min(p.Distance(center) * 10, power - 10))
936 {
937 EClass._map.SetSeen(p.x, p.z);
938 }
939 });
940 }
941
942 public void RefreshFOV(int x, int z, int radius = 6, bool recalculate = false)
943 {
944 ForeachSphere(x, z, radius, delegate(Point p)
945 {
946 List<Card> list = p.ListCards();
947 if (recalculate)
948 {
949 foreach (Card item in list)
950 {
951 item.RecalculateFOV();
952 }
953 return;
954 }
955 foreach (Card item2 in list)
956 {
957 item2.CalculateFOV();
958 }
959 });
960 }
961
962 public void RefreshFOVAll()
963 {
964 foreach (Card item in ((IEnumerable<Card>)EClass._map.things).Concat((IEnumerable<Card>)EClass._map.charas))
965 {
966 item.RecalculateFOV();
967 }
968 }
969
970 public void SetFloor(int x, int z, int idMat = 0, int idFloor = 0)
971 {
972 SetFloor(x, z, idMat, idFloor, 0);
973 }
974
975 public void SetFloor(int x, int z, int idMat, int idFloor, int dir)
976 {
977 Cell cell = cells[x, z];
978 cell._floorMat = (byte)idMat;
979 cell._floor = (byte)idFloor;
980 cell.floorDir = dir;
981 cell.isWatered = false;
984 }
985
986 public void SetDeco(int x, int z, int idMat, int idDeco)
987 {
988 Cell cell = cells[x, z];
989 cell._decoMat = (byte)idMat;
990 cell._deco = (byte)idDeco;
992 }
993
994 public void SetBridge(int x, int z, int height = 0, int idMat = 0, int idBridge = 0, int dir = 0, byte idPillar = 0)
995 {
996 Cell cell = cells[x, z];
997 cell.bridgeHeight = (byte)height;
998 cell._bridgeMat = (byte)idMat;
999 cell._bridge = (byte)idBridge;
1000 cell.bridgePillar = idPillar;
1001 cell.floorDir = dir;
1002 if (cell.room != null)
1003 {
1004 cell.room.SetDirty();
1005 }
1007 }
1008
1009 public void SetRoofBlock(int x, int z, int idMat, int idBlock, int dir, int height)
1010 {
1011 Cell cell = cells[x, z];
1012 cell._roofBlockMat = (byte)idMat;
1013 cell._roofBlock = (byte)idBlock;
1014 cell._roofBlockDir = (byte)(dir + height * 4);
1016 }
1017
1018 public void SetBlock(int x, int z, int idMat = 0, int idBlock = 0)
1019 {
1020 SetBlock(x, z, idMat, idBlock, 0);
1021 }
1022
1023 public void SetBlock(int x, int z, int idMat, int idBlock, int dir)
1024 {
1025 Cell cell = cells[x, z];
1026 bool hasFloodBlock = cell.HasFloodBlock;
1027 cell._blockMat = (byte)idMat;
1028 cell._block = (byte)idBlock;
1029 cell.blockDir = dir;
1030 if (cell.effect == null || !cell.effect.IsFire)
1031 {
1032 cell.effect = null;
1033 }
1034 cell.isToggleWallPillar = false;
1035 if (cell.room != null)
1036 {
1037 cell.room.SetDirty();
1038 }
1039 if (hasFloodBlock || cell.HasFloodBlock)
1040 {
1042 }
1044 }
1045
1046 public void OnSetBlockOrDoor(int x, int z)
1047 {
1048 new Point(x, z);
1049 TryRemoveRoom(x, z);
1050 if (x > 0)
1051 {
1052 TryRemoveRoom(x - 1, z);
1053 }
1054 if (x < Size - 1)
1055 {
1056 TryRemoveRoom(x + 1, z);
1057 }
1058 if (z > 0)
1059 {
1060 TryRemoveRoom(x, z - 1);
1061 }
1062 if (z < Size - 1)
1063 {
1064 TryRemoveRoom(x, z + 1);
1065 }
1066 if (x > 0 && z < Size - 1)
1067 {
1068 TryRemoveRoom(x - 1, z + 1);
1069 }
1070 roomHash.Clear();
1071 TryAddRoom(x, z);
1072 if (x > 0)
1073 {
1074 TryAddRoom(x - 1, z);
1075 }
1076 if (x < Size - 1)
1077 {
1078 TryAddRoom(x + 1, z);
1079 }
1080 if (z > 0)
1081 {
1082 TryAddRoom(x, z - 1);
1083 }
1084 if (z < Size - 1)
1085 {
1086 TryAddRoom(x, z + 1);
1087 }
1088 if (x > 0 && z < Size - 1)
1089 {
1090 TryAddRoom(x - 1, z + 1);
1091 }
1092 }
1093
1094 public void TryRemoveRoom(int x, int z)
1095 {
1096 if (!cells[x, z].HasFloodBlock)
1097 {
1098 Room room = cells[x, z].room;
1099 if (room != null)
1100 {
1101 rooms.RemoveRoom(room);
1102 }
1103 }
1104 }
1105
1106 public void TryAddRoom(int x, int z)
1107 {
1108 if (EClass._zone.DisableRooms || roomHash.Contains(x + z * Size) || cells[x, z].HasFloodBlock)
1109 {
1110 return;
1111 }
1112 FloodSpiller floodSpiller = flood;
1113 IFloodCell[,] array = cells;
1114 FloodSpiller.Result result = floodSpiller.SpillFlood(array, x, z);
1115 if (!result.IsValid)
1116 {
1117 return;
1118 }
1119 bool flag = false;
1120 foreach (IFloodCell item in result.visited)
1121 {
1122 if (item.hasDoor)
1123 {
1124 flag = true;
1125 break;
1126 }
1127 Cell cell = item as Cell;
1128 if (cell.sourceBlock.tileType.IsFloodDoor || cell.Front.hasDoor || cell.Right.hasDoor || cell.FrontRight.hasDoor || cell.Back.hasDoor || cell.Left.hasDoor || cell.BackLeft.hasDoor)
1129 {
1130 flag = true;
1131 break;
1132 }
1133 }
1134 if (!flag && IsIndoor)
1135 {
1136 foreach (IFloodCell item2 in result.visited)
1137 {
1138 Cell cell2 = item2 as Cell;
1139 if (cell2.detail == null || cell2.detail.things.Count == 0)
1140 {
1141 continue;
1142 }
1143 foreach (Thing thing in cell2.detail.things)
1144 {
1145 if (thing.trait is TraitRoomPlate || thing.trait is TraitHouseBoard)
1146 {
1147 flag = true;
1148 break;
1149 }
1150 }
1151 if (flag)
1152 {
1153 break;
1154 }
1155 }
1156 }
1157 if (!flag)
1158 {
1159 return;
1160 }
1161 Room room = rooms.AddRoom(new Room());
1162 foreach (IFloodCell item3 in result.visited)
1163 {
1164 Cell cell3 = item3 as Cell;
1165 byte b = cell3.x;
1166 byte b2 = cell3.z;
1167 room.AddPoint(new Point(b, b2));
1168 roomHash.Add(b + b2 * Size);
1169 if (b2 > 0 && cell3.Front.HasFloodBlock && cell3.Front.room == null)
1170 {
1171 room.AddPoint(new Point(b, b2 - 1));
1172 roomHash.Add(b + (b2 - 1) * Size);
1173 }
1174 if (b < Size - 1 && cell3.Right.HasFloodBlock && cell3.Right.room == null)
1175 {
1176 room.AddPoint(new Point(b + 1, b2));
1177 roomHash.Add(b + 1 + b2 * Size);
1178 }
1179 if (b2 > 0 && b < Size - 1 && cell3.FrontRight.HasFloodBlock && cell3.FrontRight.room == null)
1180 {
1181 room.AddPoint(new Point(b + 1, b2 - 1));
1182 roomHash.Add(b + 1 + (b2 - 1) * Size);
1183 }
1184 }
1185 }
1186
1187 public void SetBlockDir(int x, int z, int dir)
1188 {
1189 Cell cell = cells[x, z];
1190 cell._block = (byte)cell.sourceBlock.id;
1191 cell.blockDir = dir;
1192 }
1193
1194 public void ModFire(int x, int z, int amount)
1195 {
1196 Cell cell = cells[x, z];
1197 if (amount <= 0 || (!cell.IsTopWaterAndNoSnow && !cell.IsSnowTile && !EClass._zone.IsUnderwater))
1198 {
1199 if (cell.effect == null && amount > 0)
1200 {
1201 SE.Play("fire");
1202 }
1203 int num = amount + (cell.effect?.FireAmount ?? 0);
1204 if (num > 20)
1205 {
1206 num = 20;
1207 }
1208 if (num <= 0)
1209 {
1210 cell.effect = null;
1211 return;
1212 }
1213 cell.effect = new CellEffect
1214 {
1215 id = 3,
1216 amount = num
1217 };
1219 }
1220 }
1221
1222 public void TryShatter(Point pos, int ele, int power, Card CC = null)
1223 {
1224 bool flag = false;
1225 if (CC != null && CC.IsPCFactionOrMinion && (CC.HasElement(1651) || EClass.pc.Evalue(1651) >= 2))
1226 {
1227 flag = true;
1228 }
1229 Element element = Element.Create(ele);
1230 List<Card> list = new List<Card>();
1231 bool fire = ele == 910;
1232 bool cold = ele == 911;
1233 _ = fire;
1234 List<Card> list2 = pos.ListCards();
1235 if (fire && (pos.cell.IsSnowTile || pos.cell.IsTopWater))
1236 {
1237 return;
1238 }
1239 foreach (Card item in list2)
1240 {
1241 if (item.ResistLvFrom(ele) >= 3 || item.trait is TraitBlanket || (EClass.rnd(3) == 0 && !CanCook(item)) || (item.IsPCFaction && EClass.rnd(3) == 0) || (fire && item.HasCondition<ConWet>()) || (cold && item.HasCondition<ConBurning>()))
1242 {
1243 continue;
1244 }
1245 if (flag)
1246 {
1247 if (item.isChara)
1248 {
1249 if (item.IsPCFactionOrMinion)
1250 {
1251 continue;
1252 }
1253 }
1254 else if (!CanCook(item))
1255 {
1256 continue;
1257 }
1258 }
1260 {
1261 Card rootCard = item.GetRootCard();
1262 if (!rootCard.isChara || rootCard.Chara.IsPCFaction)
1263 {
1264 if (pos.IsSync)
1265 {
1266 Msg.Say("damage_protectCore", item);
1267 }
1268 continue;
1269 }
1270 }
1271 if (item.isThing && item.things.Count == 0)
1272 {
1273 list.Add(item);
1274 }
1275 else
1276 {
1277 if (ele == 911 && item.HasElement(1236))
1278 {
1279 continue;
1280 }
1281 Thing thing = ((ele == 910) ? item.things.FindBest<TraitBlanketFireproof>((Thing t) => -t.c_charges) : item.things.FindBest<TraitBlanketColdproof>((Thing t) => -t.c_charges));
1282 if (thing != null)
1283 {
1284 thing.ModCharge(-1);
1285 Card rootCard2 = item.GetRootCard();
1286 if (pos.IsSync)
1287 {
1288 Msg.Say((item.isChara ? "blanketInv_" : "blanketGround_") + element.source.alias, thing, item);
1289 }
1290 if (thing.c_charges <= 0)
1291 {
1292 thing.Die(element);
1293 if (rootCard2.IsPCParty)
1294 {
1296 }
1297 }
1298 continue;
1299 }
1300 foreach (Thing item2 in item.things.List((Thing a) => a.things.Count == 0))
1301 {
1302 Card parentCard = item2.parentCard;
1303 if (parentCard == null || (!(parentCard.trait is TraitChestMerchant) && !parentCard.HasEditorTag(EditorTag.PreciousContainer)))
1304 {
1305 list.Add(item2);
1306 }
1307 }
1308 }
1309 }
1310 list.Shuffle();
1311 int num = 0;
1312 bool flag2 = false;
1313 foreach (Card item3 in list)
1314 {
1315 if (!item3.trait.CanBeDestroyed || item3.category.IsChildOf("currency") || item3.trait is TraitDoor || item3.trait is TraitFigure || item3.trait is TraitTrainingDummy || item3.rarity >= Rarity.Legendary)
1316 {
1317 continue;
1318 }
1319 Card rootCard3 = item3.GetRootCard();
1320 if (item3.IsEquipmentOrRangedOrAmmo && (EClass.rnd(4) != 0 || ((item3.IsRangedWeapon || item3.Thing.isEquipped) && rootCard3.IsPCFaction && EClass.rnd(4) != 0)))
1321 {
1322 continue;
1323 }
1324 switch (ele)
1325 {
1326 case 910:
1327 if (item3.isFireproof || (!item3.category.IsChildOf("book") && EClass.rnd(2) == 0))
1328 {
1329 continue;
1330 }
1331 break;
1332 case 911:
1333 if (!item3.category.IsChildOf("drink") && EClass.rnd(5) == 0)
1334 {
1335 continue;
1336 }
1337 break;
1338 }
1339 if (EClass.rnd(num * num) != 0)
1340 {
1341 continue;
1342 }
1343 bool flag3 = CanCook(item3);
1344 string text = "";
1345 if (flag3)
1346 {
1347 if (fire)
1348 {
1349 List<SourceThing.Row> list3 = new List<SourceThing.Row>();
1350 foreach (RecipeSource item4 in RecipeManager.list)
1351 {
1352 if (!(item4.row is SourceThing.Row { isOrigin: false, chance: not 0 } row) || row.components.IsEmpty() || (row.components.Length >= 3 && !row.components[2].StartsWith('+')) || !row.Category.IsChildOf("meal") || (row.HasTag(CTAG.dish_fail) && power > EClass.rnd(500)))
1353 {
1354 continue;
1355 }
1356 if (!row.factory.IsEmpty())
1357 {
1358 switch (row.factory[0])
1359 {
1360 case "chopper":
1361 case "mixer":
1362 case "camppot":
1363 case "cauldron":
1364 continue;
1365 }
1366 }
1367 if (row.components[0].Split('|').Contains(item3.id) || row.components[0].Split('|').Contains(item3.sourceCard._origin))
1368 {
1369 list3.Add(row);
1370 }
1371 }
1372 if (list3.Count > 0)
1373 {
1374 text = list3.RandomItemWeighted((SourceThing.Row r) => r.chance)?.id;
1375 }
1376 }
1377 else
1378 {
1379 text = "711";
1380 }
1381 }
1382 if (flag3 && !text.IsEmpty())
1383 {
1384 Thing thing2 = item3.Split(1);
1385 List<Thing> list4 = new List<Thing>();
1386 list4.Add(thing2);
1387 Thing thing3 = ThingGen.Create(text);
1388 CraftUtil.MakeDish(thing3, list4, 999);
1389 thing3.elements.ModBase(2, EClass.curve(power / 10, 50, 10));
1390 if (pos.IsSync)
1391 {
1392 Msg.Say(((rootCard3 == item3) ? "cook_groundItem" : "cook_invItem") + (fire ? "" : "_cold"), thing2, rootCard3, thing3.Name);
1393 }
1394 if (rootCard3 == item3)
1395 {
1396 EClass._zone.AddCard(thing3, item3.pos);
1397 }
1398 else if (rootCard3.isChara)
1399 {
1400 rootCard3.Chara.Pick(thing3, msg: false);
1401 }
1402 else
1403 {
1404 rootCard3.AddThing(thing3);
1405 }
1406 thing2.Destroy();
1407 }
1408 else
1409 {
1410 int num2 = EClass.rnd(item3.Num) / 2 + 1;
1411 if (item3.Num > num2)
1412 {
1413 Thing thing4 = item3.Split(num2);
1414 if (pos.IsSync)
1415 {
1416 Msg.Say((rootCard3 == item3) ? "damage_groundItem" : "damage_invItem", thing4, rootCard3);
1417 }
1418 thing4.Destroy();
1419 if (rootCard3.IsPCFaction)
1420 {
1421 WidgetPopText.Say("popDestroy".lang(thing4.Name, rootCard3.Name));
1422 }
1423 }
1424 else
1425 {
1426 item3.Die(element);
1427 if (rootCard3.IsPCFaction)
1428 {
1429 WidgetPopText.Say("popDestroy".lang(item3.Name, rootCard3.Name));
1430 }
1431 }
1432 }
1433 if (rootCard3.IsPCParty)
1434 {
1436 }
1437 if (!flag2)
1438 {
1439 pos.PlayEffect(fire ? "Element/eleFire" : "Element/eleCold");
1440 flag2 = true;
1441 }
1442 num++;
1443 }
1444 _ValidateInstalled(pos.x, pos.z);
1445 bool CanCook(Card c)
1446 {
1447 if ((fire || cold) && c.IsFood)
1448 {
1449 return c.category.IsChildOf("foodstuff");
1450 }
1451 return false;
1452 }
1453 }
1454
1455 public void Burn(int x, int z, bool instant = false)
1456 {
1457 Cell cell = cells[x, z];
1458 Point sharedPoint = cell.GetSharedPoint();
1459 if ((instant || EClass.rnd(10) == 0) && cell.HasObj)
1460 {
1461 if (cell.sourceObj.tileType is TileTypeTree)
1462 {
1463 SetObj(x, z, cell.matObj_fixed.id, 59, 0, EClass.rnd(4));
1464 }
1465 else
1466 {
1467 SetObj(x, z);
1468 if (EClass.rnd(2) == 0)
1469 {
1470 EClass._zone.AddCard(ThingGen.Create((EClass.rnd(2) == 0) ? "ash" : "ash2"), sharedPoint);
1471 }
1472 }
1473 }
1474 if ((instant || EClass.rnd(5) == 0) && cell._block != 0 && cell._block != 96)
1475 {
1476 if (EClass.rnd(10) == 0 || !cell.sourceBlock.tileType.IsWall)
1477 {
1478 cell._block = 0;
1479 }
1480 else
1481 {
1482 cell._block = 96;
1483 }
1484 SetObj(x, z);
1485 if (cell.room != null)
1486 {
1487 cell.room.SetDirty();
1488 }
1490 }
1491 if (instant || EClass.rnd(10) == 0)
1492 {
1493 if (EClass.rnd(4) != 0)
1494 {
1495 cell._floor = 49;
1496 }
1497 if (cell._bridge != 0 && EClass.rnd(5) != 0)
1498 {
1499 cell._bridge = 49;
1500 }
1501 }
1502 foreach (Card item in sharedPoint.ListCards())
1503 {
1504 if (item.trait.CanBeDestroyed && !item.trait.IsDoor && !item.isFireproof && !item.category.IsChildOf("currency") && item.rarity < Rarity.Legendary && !(item.trait is TraitFigure) && item.isThing)
1505 {
1506 if (instant)
1507 {
1508 item.Destroy();
1509 EClass._zone.AddCard(ThingGen.Create((EClass.rnd(2) == 0) ? "ash" : "ash2"), sharedPoint);
1510 }
1511 else
1512 {
1513 item.DamageHP(30L, 910);
1514 }
1515 }
1516 }
1517 if (instant)
1518 {
1519 cell.effect = null;
1520 }
1521 }
1522
1523 public void SetLiquid(int x, int z, CellEffect effect = null)
1524 {
1525 Cell cell = cells[x, z];
1526 if (!cell.IsTopWaterAndNoSnow || effect == null)
1527 {
1528 cell.effect = effect;
1529 }
1530 }
1531
1532 public void SetLiquid(int x, int z, int id, int value = 1)
1533 {
1534 Cell cell = cells[x, z];
1535 if (!cell.IsTopWaterAndNoSnow || value == 0)
1536 {
1537 if (value > 3)
1538 {
1539 value = 3;
1540 }
1541 if (value <= 0)
1542 {
1543 cell.effect = null;
1544 return;
1545 }
1546 cell.effect = new CellEffect
1547 {
1548 id = id,
1549 amount = value
1550 };
1551 }
1552 }
1553
1554 public void SetEffect(int x, int z, CellEffect effect = null)
1555 {
1556 cells[x, z].effect = effect;
1557 }
1558
1559 public void ModLiquid(int x, int z, int amount)
1560 {
1561 Cell cell = cells[x, z];
1562 if (!cell.IsTopWaterAndNoSnow && cell.effect != null)
1563 {
1564 cell.effect.amount += amount;
1565 if (cell.effect.amount <= 0)
1566 {
1567 cell.effect = null;
1568 }
1569 }
1570 }
1571
1572 public void ClearRainAndDecal()
1573 {
1574 ForeachCell(delegate(Cell c)
1575 {
1576 c.effect = null;
1577 c.decal = 0;
1578 });
1579 }
1580
1581 public void SetObj(int x, int z, int id = 0, int value = 1, int dir = 0)
1582 {
1583 SetObj(x, z, (byte)EClass.sources.objs.rows[id].DefaultMaterial.id, id, value, dir);
1584 }
1585
1586 public void SetObj(int x, int z, int idMat, int idObj, int value, int dir, bool ignoreRandomMat = false)
1587 {
1588 Cell cell = cells[x, z];
1589 if (cell.sourceObj.id == 118 || idObj == 118)
1590 {
1591 EClass._zone.dirtyElectricity = true;
1592 }
1593 cell.obj = (byte)idObj;
1594 cell.objVal = (byte)value;
1595 cell.objMat = (byte)idMat;
1596 cell.objDir = dir;
1597 cell.isHarvested = false;
1598 cell.isObjDyed = false;
1599 SourceObj.Row sourceObj = cell.sourceObj;
1600 if (!ignoreRandomMat && !sourceObj.matCategory.IsEmpty())
1601 {
1602 int num = EClass._zone.DangerLv;
1603 if (sourceObj.tag.Contains("spot"))
1604 {
1605 num += EClass.pc.Evalue(1656) * 5;
1606 }
1607 cell.objMat = (byte)MATERIAL.GetRandomMaterialFromCategory(num, sourceObj.matCategory.Split(','), cell.matObj).id;
1608 }
1609 if (backerObjs.ContainsKey(cell.index))
1610 {
1611 backerObjs.Remove(cell.index);
1612 }
1613 if (plants.ContainsKey(cell.index))
1614 {
1615 plants.Remove(cell.index);
1616 }
1617 cell.growth?.OnSetObj();
1618 Critter.RebuildCritter(cell);
1620 }
1621
1622 public void AddBackerTree(bool draw)
1623 {
1625 int num = ((!draw) ? 1 : 2);
1626 EClass._map.bounds.ForeachCell(delegate(Cell c)
1627 {
1628 if (num > 0 && c.growth != null && c.growth.IsTree && c.growth.IsMature && (!EClass.player.doneBackers.Contains(item.id) || EClass.core.config.test.ignoreBackerDestoryFlag) && (c.sourceObj.alias == item.tree || item.tree == "random"))
1629 {
1630 backerObjs[c.index] = item.id;
1631 Debug.Log(c.index + "/" + c.x + "/" + c.z + "/" + item.id + "/" + item.Name + "/" + item.tree);
1632 num--;
1634 }
1635 });
1636 }
1637
1639 {
1640 if (!backerObjs.ContainsKey(p.index))
1641 {
1642 return null;
1643 }
1644 return EClass.sources.backers.map.TryGetValue(backerObjs[p.index]);
1645 }
1646
1647 public void ApplyBackerObj(Point p, int id = -1)
1648 {
1649 if (!p.HasObj)
1650 {
1651 return;
1652 }
1653 bool flag = p.sourceObj.id == 82;
1654 SourceBacker.Row row = ((id != -1) ? EClass.sources.backers.map.TryGetValue(id) : (flag ? EClass.sources.backers.listRemain.NextItem(ref BackerContent.indexRemain) : EClass.sources.backers.listTree.NextItem(ref BackerContent.indexTree)));
1655 if (row == null)
1656 {
1657 return;
1658 }
1660 {
1661 backerObjs[p.index] = row.id;
1662 if (flag)
1663 {
1664 p.cell.objDir = row.skin;
1665 }
1666 }
1667 else
1668 {
1669 backerObjs.Remove(p.index);
1670 }
1671 }
1672
1673 public void DropBlockComponent(Point point, TileRow r, SourceMaterial.Row mat, bool recoverBlock, bool isPlatform = false, Chara c = null)
1674 {
1676 {
1677 return;
1678 }
1679 Thing thing = null;
1680 if (r.components.Length == 0)
1681 {
1682 return;
1683 }
1685 if (recoverBlock)
1686 {
1687 thing = ((!(r is SourceFloor.Row)) ? ThingGen.CreateBlock(r.id, mat.id) : ThingGen.CreateFloor(r.id, mat.id, isPlatform));
1688 }
1689 else
1690 {
1691 RecipeSource recipeSource = RecipeManager.Get(r.RecipeID + (isPlatform ? "-b" : ""));
1692 if (recipeSource == null)
1693 {
1694 return;
1695 }
1696 string iDIngredient = recipeSource.GetIDIngredient();
1697 if (iDIngredient == null)
1698 {
1699 return;
1700 }
1701 thing = ThingGen.Create(iDIngredient);
1702 thing.ChangeMaterial(mat.alias);
1703 }
1705 {
1706 PutAway(thing);
1707 }
1708 else
1709 {
1710 TrySmoothPick(point, thing, c);
1711 }
1712 }
1713
1714 public void MineBlock(Point point, bool recoverBlock = false, Chara c = null, bool mineObj = true)
1715 {
1716 bool flag = ActionMode.Mine.IsRoofEditMode() && point.cell._roofBlock != 0;
1717 if (!point.IsValid || (!flag && !point.cell.HasBlock))
1718 {
1719 return;
1720 }
1721 SourceMaterial.Row row = (flag ? point.matRoofBlock : point.matBlock);
1722 byte b = (flag ? point.cell._roofBlock : point.cell._block);
1723 SourceBlock.Row row2 = EClass.sources.blocks.rows[b];
1724 Effect.Get("smoke").Play(point);
1725 Effect.Get("mine").Play(point).SetParticleColor(row.GetColor())
1726 .Emit(10 + EClass.rnd(10));
1727 point.PlaySound(row.GetSoundDead(row2));
1728 row.AddBlood(point, 8);
1729 bool flag2 = c == null || c.IsAgent || c.IsPCFactionOrMinion;
1731 {
1732 flag2 = false;
1733 }
1734 if (flag)
1735 {
1736 point.cell._roofBlock = 0;
1737 RefreshSingleTile(point.x, point.z);
1738 }
1739 else
1740 {
1741 if (point.cell.HasFullBlock)
1742 {
1743 RemoveLonelyRamps(point.cell);
1744 }
1745 point.SetBlock();
1746 if (flag2 && point.sourceObj.tileType.IsBlockMount && mineObj)
1747 {
1748 MineObj(point, null, c);
1749 }
1750 }
1751 if (flag2)
1752 {
1753 DropBlockComponent(point, row2, row, recoverBlock, isPlatform: false, c);
1754 }
1755 RefreshShadow(point.x, point.z);
1756 RefreshShadow(point.x, point.z - 1);
1757 ValidateInstalled(point);
1758 RefreshFOV(point.x, point.z);
1759 if (flag2 && !point.cell.isModified && !flag)
1760 {
1761 if (b == 17 || EClass.rnd(100) == 0)
1762 {
1763 zone.AddCard(ThingGen.Create("money2"), point);
1764 }
1765 if (EClass._zone.DangerLv >= 10 && EClass.rnd(200) == 0)
1766 {
1767 zone.AddCard(ThingGen.Create("crystal_earth"), point);
1768 }
1769 if (EClass._zone.DangerLv >= 25 && EClass.rnd(200) == 0)
1770 {
1771 zone.AddCard(ThingGen.Create("crystal_sun"), point);
1772 }
1773 if (EClass._zone.DangerLv >= 40 && EClass.rnd(200) == 0)
1774 {
1775 zone.AddCard(ThingGen.Create("crystal_mana"), point);
1776 }
1777 point.cell.isModified = true;
1778 }
1779 }
1780
1781 public void MineRamp(Point point, int ramp, bool recoverBlock = false)
1782 {
1783 if (point.IsValid && point.cell.HasFullBlock)
1784 {
1785 SourceMaterial.Row matBlock = point.matBlock;
1786 byte block = point.cell._block;
1787 Effect.Get("smoke").Play(point);
1788 Effect.Get("mine").Play(point).SetParticleColor(point.matBlock.GetColor())
1789 .Emit(10 + EClass.rnd(10));
1790 MineObj(point);
1791 int rampDir = EClass._map.GetRampDir(point.x, point.z, EClass.sources.blocks.rows[ramp].tileType);
1792 RemoveLonelyRamps(point.cell);
1793 SetBlock(point.x, point.z, point.cell._blockMat, ramp, rampDir);
1794 DropBlockComponent(point, EClass.sources.blocks.rows[block], matBlock, recoverBlock);
1795 }
1796 }
1797
1798 public void MineFloor(Point point, Chara c = null, bool recoverBlock = false, bool removePlatform = true)
1799 {
1800 if (!point.IsValid || (!point.HasFloor && !point.HasBridge))
1801 {
1802 return;
1803 }
1804 SourceMaterial.Row row = (point.cell.HasBridge ? point.matBridge : point.matFloor);
1805 SourceFloor.Row c2 = (point.cell.HasBridge ? point.sourceBridge : point.sourceFloor);
1806 Effect.Get("mine").Play(point).SetParticleColor(row.GetColor())
1807 .Emit(10 + EClass.rnd(10));
1808 point.PlaySound(row.GetSoundDead(c2));
1809 MineObj(point, null, c);
1810 if (point.cell.HasBridge && removePlatform)
1811 {
1812 DropBlockComponent(EClass.pc.pos, point.sourceBridge, point.matBridge, recoverBlock, isPlatform: true, c);
1813 EClass._map.SetBridge(point.x, point.z, 0, 0, 0, 0, 0);
1814 if (point.IsSky)
1815 {
1816 EClass.pc.Kick(point, ignoreSelf: true);
1817 }
1818 return;
1819 }
1821 {
1822 DropBlockComponent(EClass.pc.pos, point.sourceFloor, row, recoverBlock, isPlatform: false, c);
1823 SetFloor(point.x, point.z, 0, 90);
1824 if (point.IsSky)
1825 {
1826 EClass.pc.Kick(point, ignoreSelf: true);
1827 }
1828 return;
1829 }
1830 if (zone.IsRegion || point.cell._floor == 40)
1831 {
1832 Thing thing = ThingGen.CreateRawMaterial(row);
1833 thing.ChangeMaterial(row.alias);
1834 TrySmoothPick(point, thing, c);
1835 }
1836 else
1837 {
1838 DropBlockComponent(point, point.sourceFloor, row, recoverBlock, isPlatform: false, c);
1839 }
1840 if (!EClass._zone.IsRegion && !point.sourceFloor.components[0].Contains("chunk@soil"))
1841 {
1842 point.SetFloor(EClass.sources.floors.rows[1].DefaultMaterial.id, 40);
1843 }
1844 }
1845
1846 public void RefreshShadow(int x, int z)
1847 {
1848 }
1849
1850 public void TrySmoothPick(Cell cell, Thing t, Chara c)
1851 {
1852 TrySmoothPick(cell.GetPoint(), t, c);
1853 }
1854
1855 public void TrySmoothPick(Point p, Thing t, Chara c)
1856 {
1857 if (c != null && c.IsAgent)
1858 {
1859 EClass.pc.PickOrDrop(p, t);
1860 }
1861 else if (c != null && c.IsPC && (c.pos.Equals(p) || EClass.core.config.game.smoothPick || EClass._zone.IsRegion))
1862 {
1863 c.PickOrDrop(p, t);
1864 }
1865 else
1866 {
1867 EClass._zone.AddCard(t, p);
1868 }
1869 }
1870
1871 public void DestroyObj(Point point)
1872 {
1873 Cell cell = point.cell;
1874 SourceObj.Row sourceObj = cell.sourceObj;
1875 SourceMaterial.Row row = (cell.isObjDyed ? sourceObj.DefaultMaterial : cell.matObj);
1876 if (sourceObj.tileType.IsBlockPass)
1877 {
1878 Effect.Get("smoke").Play(point);
1879 }
1880 Effect.Get("mine").Play(point).SetParticleColor(row.GetColor())
1881 .Emit(10 + EClass.rnd(10));
1882 point.PlaySound(row.GetSoundDead());
1883 row.AddBlood(point, 3);
1884 }
1885
1886 public void MineObj(Point point, Task task = null, Chara c = null)
1887 {
1888 if (!point.IsValid || !point.HasObj)
1889 {
1890 return;
1891 }
1892 Cell cell = point.cell;
1893 SourceObj.Row sourceObj = cell.sourceObj;
1894 if (c == null && task != null)
1895 {
1896 c = task.owner;
1897 }
1898 bool num = c == null || c.IsAgent || c.IsPCFactionOrMinion;
1899 DestroyObj(point);
1900 if (num)
1901 {
1902 SourceMaterial.Row matObj_fixed = cell.matObj_fixed;
1903 if (task is TaskHarvest { IsReapSeed: not false })
1904 {
1905 int num2 = 1 + EClass.rnd(2) + ((EClass.rnd(3) == 0) ? 1 : 0);
1906 int soilCost = EClass._zone.GetSoilCost();
1907 int maxSoil = EClass._zone.MaxSoil;
1908 if (soilCost > maxSoil)
1909 {
1910 num2 -= EClass.rnd(2 + (soilCost - maxSoil) / 10);
1911 }
1912 if (num2 <= 0)
1913 {
1914 Msg.Say("seedSpoiled", cell.GetObjName());
1915 }
1916 else if (!EClass._zone.IsUserZone)
1917 {
1918 Thing t2 = TraitSeed.MakeSeed(cell).SetNum(num2);
1919 EClass.pc.PickOrDrop(point, t2);
1920 }
1921 if (cell.growth.IsTree)
1922 {
1923 cell.isHarvested = true;
1924 return;
1925 }
1926 }
1927 else if (sourceObj.HasGrowth)
1928 {
1929 cell.growth.PopMineObj(c);
1930 }
1931 else
1932 {
1933 if (cell.HasBlock && (sourceObj.id == 18 || sourceObj.id == 19))
1934 {
1935 MineBlock(point, recoverBlock: false, c, mineObj: false);
1936 }
1938 {
1939 if (EClass.game.survival.OnMineWreck(point))
1940 {
1941 Rand.SetSeed();
1942 return;
1943 }
1944 Rand.SetSeed();
1945 }
1946 switch (sourceObj.alias)
1947 {
1948 case "nest_bird":
1949 if (EClass.rnd(5) <= 1)
1950 {
1951 Pop(ThingGen.Create((EClass.rnd(10) == 0) ? "egg_fertilized" : "_egg").TryMakeRandomItem());
1952 }
1953 break;
1954 }
1955 int num3 = EClass.rnd(EClass.rnd(sourceObj.components.Length) + 1);
1956 string[] array = sourceObj.components[num3].Split('/');
1957 Thing thing = ThingGen.Create(array[0].Split('|')[0], matObj_fixed.alias);
1958 if (array.Length > 1)
1959 {
1960 thing.SetNum(EClass.rnd(array[1].ToInt()) + 1);
1961 }
1962 Pop(thing);
1963 }
1964 }
1965 SetObj(point.x, point.z);
1966 cell.gatherCount = 0;
1967 void Pop(Thing t)
1968 {
1970 {
1972 {
1973 EClass._map.PutAway(t);
1974 }
1975 else
1976 {
1977 TrySmoothPick(point, t, c);
1978 }
1979 }
1980 }
1981 }
1982
1983 public void MineObjSound(Point point)
1984 {
1985 point.PlaySound(point.cell.matObj.GetSoundDead(point.cell.sourceObj));
1986 }
1987
1989 {
1990 return plants.TryGetValue(p.index);
1991 }
1992
1994 {
1995 return plants.TryGetValue(c.index);
1996 }
1997
1999 {
2000 PlantData plantData = new PlantData
2001 {
2002 seed = seed
2003 };
2004 plants[pos.index] = plantData;
2005 return plantData;
2006 }
2007
2008 public void RemovePlant(Point pos)
2009 {
2010 plants.Remove(pos.index);
2011 }
2012
2014 {
2015 _ValidateInstalled(p.x, p.z);
2016 _ValidateInstalled(p.x + 1, p.z);
2017 _ValidateInstalled(p.x - 1, p.z);
2018 _ValidateInstalled(p.x, p.z + 1);
2019 _ValidateInstalled(p.x, p.z - 1);
2020 }
2021
2022 public void _ValidateInstalled(int x, int y)
2023 {
2024 Point point = Point.shared.Set(x, y);
2025 if (!point.IsValid)
2026 {
2027 return;
2028 }
2029 List<Card> list = point.ListCards();
2030 CellDetail detail = point.cell.detail;
2031 if (detail == null)
2032 {
2033 return;
2034 }
2035 foreach (Card item in list)
2036 {
2037 if (!item.isThing || !item.trait.CanBeDestroyed || !item.IsInstalled)
2038 {
2039 continue;
2040 }
2041 HitResult hitResult = item.TileType._HitTest(point, item.Thing, canIgnore: false);
2042 if (item.Thing.stackOrder != detail.things.IndexOf(item.Thing) || (hitResult != HitResult.Valid && hitResult != HitResult.Warning))
2043 {
2044 if (EClass._zone.IsPCFaction || (!item.isNPCProperty && !(item.trait is TraitHarvest)))
2045 {
2046 item.SetPlaceState(PlaceState.roaming);
2047 }
2048 else if (item.rarity < Rarity.Legendary)
2049 {
2050 item.Die();
2051 }
2052 }
2053 }
2054 }
2055
2056 public void RemoveLonelyRamps(Cell cell)
2057 {
2058 for (int i = 0; i < 4; i++)
2059 {
2060 Cell dependedRamp = GetDependedRamp(cell);
2061 if (dependedRamp != null)
2062 {
2063 MineBlock(dependedRamp.GetPoint());
2064 continue;
2065 }
2066 break;
2067 }
2068 }
2069
2070 public void DestroyBlock(int x, int z)
2071 {
2072 SetBlock(x, z);
2073 }
2074
2075 public void AddDecal(int x, int z, int id, int amount = 1, bool refresh = true)
2076 {
2077 if (x < 0 || z < 0 || x >= Size || z >= Size)
2078 {
2079 return;
2080 }
2081 Cell cell = cells[x, z];
2082 if (cell.sourceFloor.tileType.AllowBlood && (cell.decal / 8 == id || cell.decal % 8 <= amount))
2083 {
2084 if (cell.decal / 8 != id && cell.decal % 8 == 0)
2085 {
2086 amount--;
2087 }
2088 int num = Mathf.Clamp(((cell.decal / 8 == id) ? (cell.decal % 8) : 0) + amount, 0, 7);
2089 cell.decal = (byte)(id * 8 + num);
2090 if (refresh)
2091 {
2093 }
2094 }
2095 }
2096
2097 public void SetDecal(int x, int z, int id = 0, int amount = 1, bool refresh = true)
2098 {
2099 cells[x, z].decal = (byte)((id != 0 && amount != 0) ? ((uint)(id * 8 + amount)) : 0u);
2100 if (refresh)
2101 {
2103 }
2104 }
2105
2106 public void SetFoormark(Point pos, int id, int angle, int offset = 0)
2107 {
2108 Cell cell = pos.cell;
2109 int tile = AngleToIndex(angle) + offset;
2110 Footmark footmark = new Footmark
2111 {
2112 tile = tile,
2113 remaining = 10
2114 };
2115 footmark.pos.Set(pos);
2116 footmarks.Add(footmark);
2117 cell.GetOrCreateDetail().footmark = footmark;
2118 }
2119
2120 public int AngleToIndex(int a)
2121 {
2122 if (EClass._zone.IsRegion)
2123 {
2124 return a switch
2125 {
2126 135 => 7,
2127 180 => 0,
2128 225 => 1,
2129 -90 => 2,
2130 -45 => 3,
2131 0 => 4,
2132 45 => 5,
2133 _ => 6,
2134 };
2135 }
2136 return a switch
2137 {
2138 135 => 0,
2139 180 => 1,
2140 225 => 2,
2141 -90 => 3,
2142 -45 => 4,
2143 0 => 5,
2144 45 => 6,
2145 _ => 7,
2146 };
2147 }
2148
2149 public void RefreshSingleTile(int x, int z)
2150 {
2151 cells[x, z].Refresh();
2152 }
2153
2154 public void RefreshAllTiles()
2155 {
2156 for (int i = 0; i < Size; i++)
2157 {
2158 for (int j = 0; j < Size; j++)
2159 {
2160 cells[i, j].Refresh();
2161 }
2162 }
2163 }
2164
2165 public void RefreshNeighborTiles(int x, int z)
2166 {
2167 cells[x, z].Refresh();
2168 for (int i = x - 2; i < x + 3; i++)
2169 {
2170 if (i < 0 || i >= Size)
2171 {
2172 continue;
2173 }
2174 for (int j = z - 2; j < z + 3; j++)
2175 {
2176 if (j >= 0 && j < Size && (x != i || z != j))
2177 {
2178 cells[i, j].Refresh();
2179 }
2180 }
2181 }
2182 }
2183
2184 public void QuickRefreshTile(int x, int z)
2185 {
2186 Cell cell = cells[x, z];
2187 Cell cell2 = ((x > 0) ? cells[x - 1, z] : Cell.Void);
2188 Cell cell3 = ((x + 1 < Size) ? cells[x + 1, z] : Cell.Void);
2189 Cell cell4 = ((z > 0) ? cells[x, z - 1] : Cell.Void);
2190 Cell cell5 = ((z + 1 < Size) ? cells[x, z + 1] : Cell.Void);
2191 Cell cell6 = ((x > 0 && z > 0) ? cells[x - 1, z - 1] : Cell.Void);
2192 Cell cell7 = ((x + 1 < Size && z > 0) ? cells[x + 1, z - 1] : Cell.Void);
2193 Cell cell8 = ((x > 0 && z + 1 < Size) ? cells[x - 1, z + 1] : Cell.Void);
2194 Cell cell9 = ((x + 1 < Size && z + 1 < Size) ? cells[x + 1, z + 1] : Cell.Void);
2195 cell.isSurrounded4d = cell2.HasFullBlock && cell3.HasFullBlock && cell4.HasFullBlock && cell5.HasFullBlock;
2196 cell.isSurrounded = cell.isSurrounded4d && cell6.HasFullBlock && cell7.HasFullBlock && cell8.HasFullBlock && cell9.HasFullBlock;
2197 }
2198
2199 public int GetRampDir(int x, int z, TileType blockType = null)
2200 {
2201 Cell cell = cells[x, z];
2202 if (cell.HasFullBlock)
2203 {
2204 if (blockType == null)
2205 {
2206 blockType = cell.sourceBlock.tileType;
2207 }
2208 Cell right = cell.Right;
2209 Cell front = cell.Front;
2210 Cell left = cell.Left;
2211 Cell back = cell.Back;
2212 if (!right.HasBlock && !right.IsVoid && left.HasFullBlock && front.CanBuildRamp(1) && back.CanBuildRamp(1))
2213 {
2214 return 1;
2215 }
2216 if (!front.HasBlock && !front.IsVoid && back.HasFullBlock && left.CanBuildRamp(0) && right.CanBuildRamp(0))
2217 {
2218 return 0;
2219 }
2220 if (!left.HasBlock && !left.IsVoid && right.HasFullBlock && front.CanBuildRamp(3) && back.CanBuildRamp(3))
2221 {
2222 return 3;
2223 }
2224 if (!back.HasBlock && !back.IsVoid && front.HasFullBlock && left.CanBuildRamp(2) && right.CanBuildRamp(2))
2225 {
2226 return 2;
2227 }
2228 if (!blockType.IsRamp)
2229 {
2230 return 0;
2231 }
2232 }
2233 return -1;
2234 }
2235
2237 {
2238 Cell right = cell.Right;
2239 if (right.HasRamp && !right.HasStairs && right.blockDir == 1)
2240 {
2241 return right;
2242 }
2243 Cell front = cell.Front;
2244 if (front.HasRamp && !front.HasStairs && front.blockDir == 0)
2245 {
2246 return front;
2247 }
2248 Cell left = cell.Left;
2249 if (left.HasRamp && !left.HasStairs && left.blockDir == 3)
2250 {
2251 return left;
2252 }
2253 Cell back = cell.Back;
2254 if (back.HasRamp && !back.HasStairs && back.blockDir == 2)
2255 {
2256 return back;
2257 }
2258 return null;
2259 }
2260
2261 public Point GetRandomPoint(Point center, int radius, int tries = 100, bool mustBeWalkable = true, bool requireLos = true)
2262 {
2263 Point point = new Point();
2264 for (int i = 0; i < tries; i++)
2265 {
2266 point.x = center.x + EClass.rnd(radius * 2 + 1) - radius;
2267 point.z = center.z + EClass.rnd(radius * 2 + 1) - radius;
2268 point.Clamp();
2269 if ((!mustBeWalkable || !point.cell.blocked) && (!requireLos || Los.IsVisible(center, point)))
2270 {
2271 return point;
2272 }
2273 }
2274 Debug.Log("GetRandomPoint failed center:" + center?.ToString() + " rad:" + radius);
2275 point.IsValid = false;
2276 return point;
2277 }
2278
2279 public new Point GetRandomEdge(int r = 3)
2280 {
2281 int num = 0;
2282 int num2 = 0;
2283 for (int i = 0; i < 10000; i++)
2284 {
2285 if (EClass.rnd(2) == 0)
2286 {
2287 num = ((EClass.rnd(2) == 0) ? EClass.rnd(r) : (Size - 1 - EClass.rnd(r)));
2288 num2 = EClass.rnd(Size);
2289 }
2290 else
2291 {
2292 num2 = ((EClass.rnd(2) == 0) ? EClass.rnd(r) : (Size - 1 - EClass.rnd(r)));
2293 num = EClass.rnd(Size);
2294 }
2295 Point surface = GetSurface(num, num2, walkable: false);
2296 if (surface.IsValid)
2297 {
2298 return surface;
2299 }
2300 }
2301 return GetSurface(Size / 2, Size / 2, walkable: false);
2302 }
2303
2305 {
2306 Point point = new Point();
2307 int num = ((EClass.rnd(2) == 0) ? 1 : (-1));
2308 int num2 = ((EClass.rnd(2) == 0) ? 1 : (-1));
2309 for (int i = 0; i < 3; i++)
2310 {
2311 point.x = center.x - num + i * num;
2312 for (int j = 0; j < 3; j++)
2313 {
2314 point.z = center.z - num2 + j * num2;
2315 if (point.IsValid && point.area == null && point.cell.CanHarvest())
2316 {
2317 return point;
2318 }
2319 }
2320 }
2321 return Point.Invalid;
2322 }
2323
2324 public List<Point> ListPointsInCircle(Point center, float radius, bool mustBeWalkable = true, bool los = true)
2325 {
2326 List<Point> list = new List<Point>();
2327 ForeachSphere(center.x, center.z, radius, delegate(Point p)
2328 {
2329 if ((!mustBeWalkable || !p.cell.blocked) && (!los || Los.IsVisible(center, p)))
2330 {
2331 list.Add(p.Copy());
2332 }
2333 });
2334 return list;
2335 }
2336
2337 public List<Point> ListPointsInSquare(Point center, int radius, bool mustBeWalkable = true, bool los = true)
2338 {
2339 List<Point> list = new List<Point>();
2340 ForeachSquare(center.x, center.z, radius, delegate(Point p)
2341 {
2342 if ((!mustBeWalkable || !p.cell.blocked) && (!los || Los.IsVisible(center, p)))
2343 {
2344 list.Add(p.Copy());
2345 }
2346 });
2347 return list;
2348 }
2349
2350 public List<Chara> ListCharasInCircle(Point center, float radius, bool los = true)
2351 {
2352 List<Chara> list = new List<Chara>();
2353 foreach (Point item in ListPointsInCircle(center, radius, mustBeWalkable: false, los))
2354 {
2355 CellDetail detail = item.detail;
2356 if (detail == null || detail.charas.Count <= 0)
2357 {
2358 continue;
2359 }
2360 foreach (Chara chara in item.detail.charas)
2361 {
2362 list.Add(chara);
2363 }
2364 }
2365 return list;
2366 }
2367
2368 public List<Point> ListPointsInArc(Point center, Point to, int radius, float angle)
2369 {
2370 Point to2 = new Point((to.x > center.x) ? 1 : ((to.x < center.x) ? (-1) : 0), (to.z > center.z) ? 1 : ((to.z < center.z) ? (-1) : 0));
2371 Point point = new Point(0, 0);
2372 List<Point> list = new List<Point>();
2373 float diff = point.GetAngle2(to2);
2374 ForeachSphere(center.x, center.z, radius, delegate(Point p)
2375 {
2376 float angle2 = center.GetAngle2(p);
2377 if ((Mathf.Abs(diff - angle2) < angle || Mathf.Abs(diff - angle2 + 360f) < angle || Mathf.Abs(360f - diff + angle2) < angle) && Los.IsVisible(center, p) && !p.IsBlocked)
2378 {
2379 list.Add(p.Copy());
2380 }
2381 });
2382 return list;
2383 }
2384
2385 public List<Point> ListPointsInLine(Point center, Point to, int radius, bool returnOnBlocked = true)
2386 {
2387 return Los.ListVisible(center, to, radius, null, returnOnBlocked);
2388 }
2389
2390 public void SetBounds(int size)
2391 {
2392 if (size > Size / 2 + 1)
2393 {
2394 size = Size / 2 - 1;
2395 }
2396 bounds.SetBounds(Size / 2 - size, Size / 2 - size, Size / 2 + size, Size / 2 + size);
2397 }
2398
2399 public void SetBounds(MapBounds b)
2400 {
2401 bounds.SetBounds(b.x, b.z, b.maxX, b.maxZ);
2402 bounds.Size = b.Size;
2403 }
2404
2405 public new void ForeachCell(Action<Cell> action)
2406 {
2407 for (int i = 0; i < Size; i++)
2408 {
2409 for (int j = 0; j < Size; j++)
2410 {
2411 action(cells[i, j]);
2412 }
2413 }
2414 }
2415
2416 public new void ForeachPoint(Action<Point> action)
2417 {
2418 Point point = new Point();
2419 for (int i = 0; i < Size; i++)
2420 {
2421 for (int j = 0; j < Size; j++)
2422 {
2423 action(point.Set(i, j));
2424 }
2425 }
2426 }
2427
2428 public new void ForeachXYZ(Action<int, int> action)
2429 {
2430 for (int i = 0; i < Size; i++)
2431 {
2432 for (int j = 0; j < Size; j++)
2433 {
2434 action(i, j);
2435 }
2436 }
2437 }
2438
2439 public void ForeachSphere(int _x, int _z, float r, Action<Point> action)
2440 {
2441 Point point = new Point();
2442 int num = (int)Mathf.Ceil(r);
2443 for (int i = _x - num; i < _x + num + 1; i++)
2444 {
2445 if (i < 0 || i >= Size)
2446 {
2447 continue;
2448 }
2449 for (int j = _z - num; j < _z + num + 1; j++)
2450 {
2451 if (j >= 0 && j < Size && (float)((i - _x) * (i - _x) + (j - _z) * (j - _z)) < r * r)
2452 {
2453 point.Set(i, j);
2454 action(point);
2455 }
2456 }
2457 }
2458 }
2459
2460 public void ForeachSquare(int _x, int _z, int r, Action<Point> action)
2461 {
2462 Point point = new Point();
2463 for (int i = _x - r; i < _x + r + 1; i++)
2464 {
2465 if (i < 0 || i >= Size)
2466 {
2467 continue;
2468 }
2469 for (int j = _z - r; j < _z + r + 1; j++)
2470 {
2471 if (j >= 0 && j < Size)
2472 {
2473 point.Set(i, j);
2474 action(point);
2475 }
2476 }
2477 }
2478 }
2479
2480 public void ForeachNeighbor(Point center, Action<Point> action)
2481 {
2482 int num = center.x;
2483 int num2 = center.z;
2484 Point point = new Point();
2485 for (int i = num - 1; i < num + 2; i++)
2486 {
2487 if (i < 0 || i >= Size)
2488 {
2489 continue;
2490 }
2491 for (int j = num2 - 1; j < num2 + 2; j++)
2492 {
2493 if (j >= 0 && j < Size)
2494 {
2495 point.Set(i, j);
2496 action(point);
2497 }
2498 }
2499 }
2500 }
2501
2502 public void Quake()
2503 {
2504 Point point = new Point();
2505 int num;
2506 for (num = 0; num < Size; num++)
2507 {
2508 int num2;
2509 for (num2 = 0; num2 < Size; num2++)
2510 {
2511 point.x = num;
2512 point.z = num2;
2513 point.Copy().Animate(AnimeID.Quake, animeBlock: true);
2514 num2 += EClass.rnd(2);
2515 }
2516 num += EClass.rnd(2);
2517 }
2518 }
2519
2520 public int CountChara(Faction faction)
2521 {
2522 int num = 0;
2523 foreach (Chara chara in charas)
2524 {
2525 if (chara.faction == faction)
2526 {
2527 num++;
2528 }
2529 }
2530 return num;
2531 }
2532
2533 public int CountGuest()
2534 {
2535 int num = 0;
2536 foreach (Chara chara in charas)
2537 {
2538 if (chara.IsGuest())
2539 {
2540 num++;
2541 }
2542 }
2543 return num;
2544 }
2545
2546 public int CountHostile()
2547 {
2548 int num = 0;
2549 foreach (Chara chara in charas)
2550 {
2551 if (!chara.IsPCFaction && chara.IsHostile())
2552 {
2553 num++;
2554 }
2555 }
2556 return num;
2557 }
2558
2559 public int CountWildAnimal()
2560 {
2561 int num = 0;
2562 foreach (Chara chara in charas)
2563 {
2564 if (!chara.IsPCFaction && chara.IsAnimal)
2565 {
2566 num++;
2567 }
2568 }
2569 return num;
2570 }
2571
2572 public int CountNonHostile()
2573 {
2574 int num = 0;
2575 foreach (Chara chara in charas)
2576 {
2577 if (!chara.IsPCFaction && !chara.IsHostile())
2578 {
2579 num++;
2580 }
2581 }
2582 return num;
2583 }
2584
2585 public List<Chara> ListChara(Faction faction)
2586 {
2587 List<Chara> list = new List<Chara>();
2588 foreach (Chara chara in charas)
2589 {
2590 if (chara.faction == faction)
2591 {
2592 list.Add(chara);
2593 }
2594 }
2595 return list;
2596 }
2597
2598 public List<Thing> ListThing<T>() where T : Trait
2599 {
2600 List<Thing> list = new List<Thing>();
2601 foreach (Thing thing in things)
2602 {
2603 if (thing.IsInstalled && thing.trait is T)
2604 {
2605 list.Add(thing);
2606 }
2607 }
2608 return list;
2609 }
2610
2611 public bool PutAway(Card c)
2612 {
2614 {
2615 return false;
2616 }
2617 if (c.isChara)
2618 {
2620 {
2621 return false;
2622 }
2623 c.Destroy();
2624 return true;
2625 }
2626 Thing thing = c.Thing;
2627 if (thing.parent != null)
2628 {
2629 thing.parent.RemoveCard(thing);
2630 }
2631 thing.isMasked = false;
2632 thing.isRoofItem = false;
2633 if (EClass._zone.IsPCFaction && EClass._map.props.installed.traits.GetRandomThing<TraitSpotStockpile>() != null)
2634 {
2635 EClass._zone.TryAddThingInSpot<TraitSpotStockpile>(thing);
2636 return true;
2637 }
2638 if (EClass.debug.enable)
2639 {
2641 return true;
2642 }
2643 EClass.pc.Pick(thing, msg: false);
2644 return true;
2645 }
2646
2647 public Chara FindChara(string id)
2648 {
2649 foreach (Chara chara in charas)
2650 {
2651 if (chara.id == id)
2652 {
2653 return chara;
2654 }
2655 }
2656 return null;
2657 }
2658
2659 public Chara FindChara(int uid)
2660 {
2661 foreach (Chara chara in charas)
2662 {
2663 if (chara.uid == uid)
2664 {
2665 return chara;
2666 }
2667 }
2668 return null;
2669 }
2670
2671 public Thing FindThing(Func<Thing, bool> func)
2672 {
2673 foreach (Thing thing in things)
2674 {
2675 if (func(thing))
2676 {
2677 return thing;
2678 }
2679 }
2680 return null;
2681 }
2682
2683 public Thing FindThing(int uid)
2684 {
2685 foreach (Thing thing in things)
2686 {
2687 if (thing.uid == uid)
2688 {
2689 return thing;
2690 }
2691 }
2692 return null;
2693 }
2694
2695 public T FindThing<T>() where T : Trait
2696 {
2697 foreach (Thing thing in things)
2698 {
2699 if (thing.trait is T)
2700 {
2701 return thing.trait as T;
2702 }
2703 }
2704 return null;
2705 }
2706
2707 public Thing FindThing(Type type, Chara c = null)
2708 {
2709 _things.Clear();
2710 foreach (Thing thing in EClass._map.props.installed.things)
2711 {
2712 if (type.IsAssignableFrom(thing.trait.GetType()) && thing.pos.IsPublicSpace())
2713 {
2714 _things.Add(thing);
2715 }
2716 }
2717 if (_things.Count <= 0)
2718 {
2719 return null;
2720 }
2721 return _things.RandomItem();
2722 }
2723
2724 public Thing FindThing(Type type, BaseArea area1, BaseArea area2 = null)
2725 {
2726 if (area1 == null && area2 == null)
2727 {
2728 return null;
2729 }
2730 Thing thing = Find(area1);
2731 if (thing == null && area2 != null)
2732 {
2733 thing = Find(area2);
2734 }
2735 return thing;
2736 Thing Find(BaseArea area)
2737 {
2738 _things.Clear();
2739 foreach (Thing thing2 in EClass._map.props.installed.things)
2740 {
2741 if (type.IsAssignableFrom(thing2.trait.GetType()) && thing2.pos.HasRoomOrArea(area))
2742 {
2743 _things.Add(thing2);
2744 }
2745 }
2746 if (_things.Count <= 0)
2747 {
2748 return null;
2749 }
2750 return _things.RandomItem();
2751 }
2752 }
2753
2754 public Thing FindThing(string workTag, BaseArea area1 = null, BaseArea area2 = null)
2755 {
2756 if (area1 == null && area2 == null)
2757 {
2758 return null;
2759 }
2760 Thing thing = null;
2761 PropSet orCreate = EClass._map.Installed.workMap.GetOrCreate(workTag);
2762 if (area1 != null)
2763 {
2764 IEnumerable<Card> enumerable = orCreate.Where((Card a) => a.pos.HasRoomOrArea(area1));
2765 if (enumerable.Count() > 0)
2766 {
2767 thing = enumerable.RandomItem() as Thing;
2768 }
2769 }
2770 if (thing == null && area2 != null)
2771 {
2772 IEnumerable<Card> enumerable2 = orCreate.Where((Card a) => a.pos.HasRoomOrArea(area2));
2773 if (enumerable2.Count() > 0)
2774 {
2775 thing = enumerable2.RandomItem() as Thing;
2776 }
2777 }
2778 return thing;
2779 }
2780
2781 public Thing FindThing(string workTag, Chara c)
2782 {
2783 Thing result = null;
2784 IEnumerable<Card> enumerable = from a in EClass._map.Installed.workMap.GetOrCreate(workTag)
2785 where a.pos.IsPublicSpace()
2786 select a;
2787 if (enumerable.Count() > 0)
2788 {
2789 result = enumerable.RandomItem() as Thing;
2790 }
2791 return result;
2792 }
2793
2795 {
2796 return (from a in ((IEnumerable<BaseArea>)rooms.listArea).Concat((IEnumerable<BaseArea>)rooms.listRoom)
2797 where a.type.IsPublicArea
2798 select a).RandomItem();
2799 }
2800
2801 public void RefreshSunMap()
2802 {
2803 if (!isDirtySunMap)
2804 {
2805 return;
2806 }
2807 sunMap.Clear();
2808 foreach (Card sun in EClass._map.props.installed.traits.suns)
2809 {
2810 foreach (Point item in sun.trait.ListPoints(null, onlyPassable: false))
2811 {
2812 sunMap.Add(item.index);
2813 }
2814 }
2815 isDirtySunMap = false;
2816 }
2817}
AnimeID
Definition: AnimeID.cs:2
CTAG
Definition: CTAG.cs:2
static bool not(DramaManager dm, Dictionary< string, string > line, params string[] parameters)
EditorTag
Definition: EditorTag.cs:2
HitResult
Definition: HitResult.cs:2
PlaceState
Definition: PlaceState.cs:2
Rarity
Definition: Rarity.cs:2
int itemLost
Definition: AM_Adv.cs:110
override bool IsRoofEditMode(Card c=null)
Definition: AM_Mine.cs:19
void Add(Act a, string s="")
Definition: ActPlan.cs:11
static AM_Copy Copy
Definition: ActionMode.cs:45
bool IsActive
Definition: ActionMode.cs:121
virtual bool IsBuildMode
Definition: ActionMode.cs:181
static AM_Mine Mine
Definition: ActionMode.cs:33
static AM_Adv Adv
Definition: ActionMode.cs:15
static int indexTree
Definition: BackerContent.cs:3
static int indexRemain
Definition: BackerContent.cs:5
Version version
Definition: BaseCore.cs:17
static BaseCore Instance
Definition: BaseCore.cs:11
void KillActor()
Definition: Card.cs:11
bool isDestroyed
Definition: Card.cs:78
Thing TryMakeRandomItem(int lv=-1, TryMakeRandomItemSource itemSource=TryMakeRandomItemSource.Default, Chara crafter=null)
Definition: Card.cs:5727
bool IsPCFactionOrMinion
Definition: Card.cs:2342
virtual bool IsMultisize
Definition: Card.cs:2212
virtual bool isThing
Definition: Card.cs:2133
virtual Chara Chara
Definition: Card.cs:2122
Thing Split(int a)
Definition: Card.cs:3658
bool IsAgent
Definition: Card.cs:2303
void SetPlaceState(PlaceState newState, bool byPlayer=false)
Definition: Card.cs:3921
ElementContainerCard elements
Definition: Card.cs:42
string id
Definition: Card.cs:36
virtual void Die(Element e=null, Card origin=null, AttackSource attackSource=AttackSource.None, Chara originalTarget=null)
Definition: Card.cs:5233
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:3210
string c_altName
Definition: Card.cs:1633
virtual bool IsPCParty
Definition: Card.cs:2203
void CalculateFOV()
Definition: Card.cs:6935
Thing AddThing(string id, int lv=-1)
Definition: Card.cs:3273
string Name
Definition: Card.cs:2191
ICardParent parent
Definition: Card.cs:56
void Kick(Point p, bool ignoreSelf=false, bool checkWall=true)
Definition: Card.cs:6272
Thing SetNum(int a)
Definition: Card.cs:3669
void ForeachPoint(Action< Point, bool > action)
Definition: Card.cs:8324
bool IsFood
Definition: Card.cs:2229
Point pos
Definition: Card.cs:60
void ClearFOV()
Definition: Card.cs:7025
int uid
Definition: Card.cs:125
Trait trait
Definition: Card.cs:54
void ModCharge(int a, bool destroy=false)
Definition: Card.cs:4124
void Destroy()
Definition: Card.cs:5301
bool HasEditorTag(EditorTag tag)
Definition: Card.cs:2733
ThingContainer things
Definition: Card.cs:39
bool IsInstalled
Definition: Card.cs:2451
virtual bool IsPC
Definition: Card.cs:2197
virtual bool isChara
Definition: Card.cs:2135
virtual Thing Thing
Definition: Card.cs:2110
Card GetRootCard()
Definition: Card.cs:3600
int Evalue(int ele)
Definition: Card.cs:2704
virtual bool IsPCFaction
Definition: Card.cs:2339
Cell Cell
Definition: Card.cs:2107
bool isPlayerCreation
Definition: Card.cs:497
Card parentCard
Definition: Card.cs:106
Thing Add(string id, int num=1, int lv=1)
Definition: Card.cs:3250
int Num
Definition: Card.cs:161
SourceCategory.Row category
Definition: Card.cs:2101
Point lastPos
Definition: Card.cs:62
int c_charges
Definition: Card.cs:1309
CardRenderer renderer
Definition: Card.cs:64
List< Thing > things
Definition: CellDetail.cs:11
List< Chara > charas
Definition: CellDetail.cs:13
Footmark footmark
Definition: CellDetail.cs:17
int amount
Definition: CellEffect.cs:26
int FireAmount
Definition: CellEffect.cs:162
bool IsFire
Definition: CellEffect.cs:147
Definition: Cell.cs:7
byte _block
Definition: Cell.cs:32
bool CanHarvest()
Definition: Cell.cs:1700
Room room
Definition: Cell.cs:110
void RemoveCard(Card c)
Definition: Cell.cs:1602
SourceBlock.Row sourceBlock
Definition: Cell.cs:1062
bool IsSnowTile
Definition: Cell.cs:790
bool HasBlock
Definition: Cell.cs:651
byte objMat
Definition: Cell.cs:44
bool CanBuildRamp(int dir)
Definition: Cell.cs:1155
SourceFloor.Row sourceFloor
Definition: Cell.cs:1064
CellEffect effect
Definition: Cell.cs:102
byte _bridge
Definition: Cell.cs:48
byte _floor
Definition: Cell.cs:36
Cell Back
Definition: Cell.cs:161
bool HasStairs
Definition: Cell.cs:863
byte decal
Definition: Cell.cs:46
bool HasBridge
Definition: Cell.cs:679
Point GetSharedPoint()
Definition: Cell.cs:1118
bool isHarvested
Definition: Cell.cs:338
bool IsTopWaterAndNoSnow
Definition: Cell.cs:720
bool isClearSnow
Definition: Cell.cs:458
Cell Front
Definition: Cell.cs:137
SourceMaterial.Row matObj
Definition: Cell.cs:1046
byte _deco
Definition: Cell.cs:58
CellDetail GetOrCreateDetail()
Definition: Cell.cs:1569
byte _decoMat
Definition: Cell.cs:60
byte objVal
Definition: Cell.cs:42
byte _floorMat
Definition: Cell.cs:38
byte _blockMat
Definition: Cell.cs:34
void Refresh()
Definition: Cell.cs:1164
void Reset()
Definition: Cell.cs:1562
bool isModified
Definition: Cell.cs:446
byte _roofBlock
Definition: Cell.cs:52
byte _bridgeMat
Definition: Cell.cs:50
bool IsTopWater
Definition: Cell.cs:708
byte height
Definition: Cell.cs:80
GrowSystem growth
Definition: Cell.cs:233
bool isWatered
Definition: Cell.cs:350
CellDetail detail
Definition: Cell.cs:100
byte _roofBlockDir
Definition: Cell.cs:56
bool HasFloodBlock
Definition: Cell.cs:1025
bool isToggleWallPillar
Definition: Cell.cs:566
byte z
Definition: Cell.cs:64
Cell Left
Definition: Cell.cs:173
byte _roofBlockMat
Definition: Cell.cs:54
bool isSeen
Definition: Cell.cs:290
void AddCard(Card c)
Definition: Cell.cs:1586
byte obj
Definition: Cell.cs:40
SourceObj.Row sourceObj
Definition: Cell.cs:1084
Cell BackLeft
Definition: Cell.cs:221
string GetObjName()
Definition: Cell.cs:1640
bool isForceFloat
Definition: Cell.cs:314
byte x
Definition: Cell.cs:62
Point GetPoint()
Definition: Cell.cs:1113
bool impassable
Definition: Cell.cs:410
static Cell Void
Definition: Cell.cs:10
bool HasObj
Definition: Cell.cs:649
Cell Right
Definition: Cell.cs:149
bool crossWall
Definition: Cell.cs:638
bool isObjDyed
Definition: Cell.cs:626
bool HasRamp
Definition: Cell.cs:845
byte bridgeHeight
Definition: Cell.cs:82
int index
Definition: Cell.cs:122
bool hasDoor
Definition: Cell.cs:266
int blockDir
Definition: Cell.cs:906
byte _dirs
Definition: Cell.cs:30
bool HasFullBlock
Definition: Cell.cs:825
bool IsVoid
Definition: Cell.cs:967
SourceMaterial.Row matObj_fixed
Definition: Cell.cs:1049
Cell FrontRight
Definition: Cell.cs:185
byte bridgePillar
Definition: Cell.cs:90
Definition: Chara.cs:10
new TraitChara trait
Definition: Chara.cs:509
Faction faction
Definition: Chara.cs:431
override bool IsPC
Definition: Chara.cs:630
override bool IsGlobal
Definition: Chara.cs:628
Point orgPos
Definition: Chara.cs:21
bool IsAnimal
Definition: Chara.cs:914
void PickOrDrop(Point p, string idThing, int idMat=-1, int num=1, bool msg=true)
Definition: Chara.cs:4522
override bool IsPCFaction
Definition: Chara.cs:689
bool IsGuest()
Definition: Chara.cs:6940
bool IsHostile()
Definition: Chara.cs:6849
Thing Pick(Thing t, bool msg=true, bool tryStack=true)
Definition: Chara.cs:4542
Definition: ConWet.cs:2
bool ignoreBackerDestoryFlag
Definition: CoreConfig.cs:568
new GameConfig game
Definition: CoreConfig.cs:617
bool enable
Definition: CoreDebug.cs:301
bool godBuild
Definition: CoreDebug.cs:319
Thing GetOrCreateDebugContainer()
Definition: CoreDebug.cs:785
bool ignoreBuildRule
Definition: CoreDebug.cs:200
CoreConfig config
Definition: Core.cs:70
static void MakeDish(Thing food, int lv, Chara crafter=null, int seed=-1)
Definition: CraftUtil.cs:62
static void RebuildCritter(Cell cell)
Definition: Critter.cs:93
Definition: EClass.cs:6
static Game game
Definition: EClass.cs:9
static int curve(long _a, int start, int step, int rate=75)
Definition: EClass.cs:69
static Scene scene
Definition: EClass.cs:31
static Core core
Definition: EClass.cs:7
static Zone _zone
Definition: EClass.cs:21
static Map _map
Definition: EClass.cs:19
static int rnd(long a)
Definition: EClass.cs:59
static SourceManager sources
Definition: EClass.cs:43
static FactionBranch Branch
Definition: EClass.cs:23
static Player player
Definition: EClass.cs:13
static Chara pc
Definition: EClass.cs:15
static CoreDebug debug
Definition: EClass.cs:49
Definition: Effect.cs:7
static Effect Get(Effect original)
Definition: Effect.cs:80
void Play(float delay, Point from, float fixY=0f, Point to=null, Sprite sprite=null)
Definition: Effect.cs:100
Element ModBase(int ele, int v)
static Element Create(int id, int v=0)
Definition: ELEMENT.cs:1123
bool HasItemProtection
Point pos
Definition: Footmark.cs:3
static FowProfile Load(string id)
Definition: FowProfile.cs:9
Definition: GameIO.cs:11
static void SaveFile(string path, object obj)
Definition: GameIO.cs:257
bool disableUsermapBenefit
Definition: Game.cs:9
SurvivalManager survival
Definition: Game.cs:228
static void Load(string id, bool cloud)
Definition: Game.cs:322
GamePrincipal principal
Definition: Game.cs:225
static string id
Definition: Game.cs:148
bool Save(bool isAutoSave=false, bool silent=false)
Definition: Game.cs:1040
bool IsSurvival
Definition: Game.cs:276
void PopMineObj(Chara c=null)
Definition: GrowSystem.cs:547
virtual bool IsMature
Definition: GrowSystem.cs:117
virtual void OnSetObj()
Definition: GrowSystem.cs:283
virtual bool IsTree
Definition: GrowSystem.cs:101
Compression
Definition: IO.cs:12
LogicalPoint GetOrCreate(Point point)
Definition: Los.cs:5
static List< Point > ListVisible(Point p1, Point p2, int radius, Action< Point, bool > _onVisit=null, bool returnOnBlocked=true)
Definition: Los.cs:90
static bool IsVisible(Point p1, Point p2, Action< Point, bool > _onVisit=null)
Definition: Los.cs:167
static SourceMaterial.Row GetRandomMaterialFromCategory(int lv, string cat, SourceMaterial.Row fallback)
Definition: MATERIAL.cs:93
int Size
Definition: MapBounds.cs:20
int maxZ
Definition: MapBounds.cs:17
void SetBounds(int _x, int _z, int _maxX, int _maxZ)
Definition: MapBounds.cs:30
Point GetSurface(int x, int z, bool walkable=true)
Definition: MapBounds.cs:171
int maxX
Definition: MapBounds.cs:14
void ForeachCell(Action< Cell > action)
Definition: MapBounds.cs:279
int x
Definition: MapBounds.cs:8
Point GetCenterPos()
Definition: MapBounds.cs:52
string idSceneProfile
Definition: MapConfig.cs:8
bool indoor
Definition: MapConfig.cs:29
string idFowProfile
Definition: MapConfig.cs:11
Definition: Map.cs:13
bool IsIndoor
Definition: Map.cs:131
new void ForeachXYZ(Action< int, int > action)
Definition: Map.cs:2428
List< int > _plNight
Definition: Map.cs:58
new void ForeachCell(Action< Cell > action)
Definition: Map.cs:2405
void TrySmoothPick(Point p, Thing t, Chara c)
Definition: Map.cs:1855
Thing FindThing(Type type, BaseArea area1, BaseArea area2=null)
Definition: Map.cs:2724
void ResetEditorPos()
Definition: Map.cs:357
void RefreshNeighborTiles(int x, int z)
Definition: Map.cs:2165
Thing FindThing(Func< Thing, bool > func)
Definition: Map.cs:2671
bool isGenerated
Definition: Map.cs:129
Cell GetCell(int index)
Definition: Map.cs:900
PlantData TryGetPlant(Point p)
Definition: Map.cs:1988
void ForeachSphere(int _x, int _z, float r, Action< Point > action)
Definition: Map.cs:2439
Dictionary< int, int > gatherCounts
Definition: Map.cs:61
BitArray32 bits
Definition: Map.cs:75
void Shift(Vector2Int offset)
Definition: Map.cs:254
Thing FindThing(Type type, Chara c=null)
Definition: Map.cs:2707
void ExportMetaData(string _path, string id, PartialMap partial=null)
Definition: Map.cs:732
Chara FindChara(string id)
Definition: Map.cs:2647
IEnumerable< Card > Cards
Definition: Map.cs:135
void RefreshSunMap()
Definition: Map.cs:2801
void RefreshSingleTile(int x, int z)
Definition: Map.cs:2149
Point GetRandomPoint(Point center, int radius, int tries=100, bool mustBeWalkable=true, bool requireLos=true)
Definition: Map.cs:2261
void RemovePlant(Point pos)
Definition: Map.cs:2008
BaseArea FindPublicArea()
Definition: Map.cs:2794
static void UpdateMetaData(string pathZip, PartialMap partial=null)
Definition: Map.cs:777
void DestroyObj(Point point)
Definition: Map.cs:1871
void SetBridge(int x, int z, int height=0, int idMat=0, int idBridge=0, int dir=0, byte idPillar=0)
Definition: Map.cs:994
void Save(string path, ZoneExportData export=null, PartialMap partial=null)
Definition: Map.cs:376
void Reset()
Definition: Map.cs:345
int SizeXZ
Definition: Map.cs:133
PropsInstalled Installed
Definition: Map.cs:123
void TrySmoothPick(Cell cell, Thing t, Chara c)
Definition: Map.cs:1850
void AddCardOnActivate(Card c)
Definition: Map.cs:795
Thing FindThing(int uid)
Definition: Map.cs:2683
Dictionary< int, CellEffect > cellEffects
Definition: Map.cs:64
void RefreshFOV(int x, int z, int radius=6, bool recalculate=false)
Definition: Map.cs:942
List< Point > ListPointsInArc(Point center, Point to, int radius, float angle)
Definition: Map.cs:2368
HashSet< int > roomHash
Definition: Map.cs:105
int CountNonHostile()
Definition: Map.cs:2572
void MoveCard(Point p, Card t)
Definition: Map.cs:853
Thing FindThing(string workTag, Chara c)
Definition: Map.cs:2781
void AddBackerTree(bool draw)
Definition: Map.cs:1622
void Reveal(Point center, int power=100)
Definition: Map.cs:931
FloodSpiller flood
Definition: Map.cs:93
void SetBlockDir(int x, int z, int dir)
Definition: Map.cs:1187
void SetBounds(int size)
Definition: Map.cs:2390
void MineObj(Point point, Task task=null, Chara c=null)
Definition: Map.cs:1886
void OnDeactivate()
Definition: Map.cs:205
void SetLiquid(int x, int z, CellEffect effect=null)
Definition: Map.cs:1523
void OnCardRemovedFromZone(Card t)
Definition: Map.cs:837
void SetZone(Zone _zone)
Definition: Map.cs:181
Point GetNearbyResourcePoint(Point center)
Definition: Map.cs:2304
void SetDecal(int x, int z, int id=0, int amount=1, bool refresh=true)
Definition: Map.cs:2097
PropsRoaming Roaming
Definition: Map.cs:125
PlantData TryGetPlant(Cell c)
Definition: Map.cs:1993
int CountChara(Faction faction)
Definition: Map.cs:2520
void MineBlock(Point point, bool recoverBlock=false, Chara c=null, bool mineObj=true)
Definition: Map.cs:1714
bool revealed
Definition: Map.cs:103
List< Chara > ListCharasInCircle(Point center, float radius, bool los=true)
Definition: Map.cs:2350
int CountHostile()
Definition: Map.cs:2546
void SetFloor(int x, int z, int idMat, int idFloor, int dir)
Definition: Map.cs:975
List< Thing > things
Definition: Map.cs:49
void OnDeserialized(StreamingContext context)
Definition: Map.cs:148
void SetFoormark(Point pos, int id, int angle, int offset=0)
Definition: Map.cs:2106
void RefreshFOVAll()
Definition: Map.cs:962
byte[] TryLoadFile(string path, string s, int size)
Definition: Map.cs:541
void _ValidateInstalled(int x, int y)
Definition: Map.cs:2022
int GetRampDir(int x, int z, TileType blockType=null)
Definition: Map.cs:2199
List< Thing > ListThing< T >()
Definition: Map.cs:2598
Dictionary< int, int > backerObjs
Definition: Map.cs:67
int CountGuest()
Definition: Map.cs:2533
List< int > _plDay
Definition: Map.cs:55
Playlist plDay
Definition: Map.cs:77
int AngleToIndex(int a)
Definition: Map.cs:2120
CustomData custom
Definition: Map.cs:40
List< Chara > deadCharas
Definition: Map.cs:46
void ModFire(int x, int z, int amount)
Definition: Map.cs:1194
void SetDeco(int x, int z, int idMat, int idDeco)
Definition: Map.cs:986
void _AddCard(int x, int z, Card t, bool onAddToZone)
Definition: Map.cs:858
void Burn(int x, int z, bool instant=false)
Definition: Map.cs:1455
void MineObjSound(Point point)
Definition: Map.cs:1983
void OnSerializing(StreamingContext context)
Definition: Map.cs:138
void SetSeen(int x, int z, bool seen=true, bool refresh=true)
Definition: Map.cs:905
PropsManager props
Definition: Map.cs:91
void ModLiquid(int x, int z, int amount)
Definition: Map.cs:1559
void MineFloor(Point point, Chara c=null, bool recoverBlock=false, bool removePlatform=true)
Definition: Map.cs:1798
void SetFloor(int x, int z, int idMat=0, int idFloor=0)
Definition: Map.cs:970
void SetBounds(MapBounds b)
Definition: Map.cs:2399
void TryShatter(Point pos, int ele, int power, Card CC=null)
Definition: Map.cs:1222
int seed
Definition: Map.cs:19
void SetBlock(int x, int z, int idMat=0, int idBlock=0)
Definition: Map.cs:1018
PlantData AddPlant(Point pos, Thing seed)
Definition: Map.cs:1998
RoomManager rooms
Definition: Map.cs:31
bool PutAway(Card c)
Definition: Map.cs:2611
void ForeachSquare(int _x, int _z, int r, Action< Point > action)
Definition: Map.cs:2460
void TryRemoveRoom(int x, int z)
Definition: Map.cs:1094
void SetReference()
Definition: Map.cs:195
BiomeProfile[,] biomes
Definition: Map.cs:95
List< Footmark > footmarks
Definition: Map.cs:99
POIMap poiMap
Definition: Map.cs:97
void SetRoofBlock(int x, int z, int idMat, int idBlock, int dir, int height)
Definition: Map.cs:1009
void ClearRainAndDecal()
Definition: Map.cs:1572
void Reload()
Definition: Map.cs:310
new Point GetRandomEdge(int r=3)
Definition: Map.cs:2279
void OnLoad()
Definition: Map.cs:720
void OnImport(ZoneExportData data)
Definition: Map.cs:726
List< Point > ListPointsInSquare(Point center, int radius, bool mustBeWalkable=true, bool los=true)
Definition: Map.cs:2337
int CountWildAnimal()
Definition: Map.cs:2559
new void ForeachPoint(Action< Point > action)
Definition: Map.cs:2416
void TryAddRoom(int x, int z)
Definition: Map.cs:1106
void DestroyBlock(int x, int z)
Definition: Map.cs:2070
void QuickRefreshTile(int x, int z)
Definition: Map.cs:2184
List< Chara > serializedCharas
Definition: Map.cs:43
float sizeModifier
Definition: Map.cs:127
Cell[,] cells
Definition: Map.cs:85
static bool isDirtySunMap
Definition: Map.cs:16
static MapMetaData GetMetaData(string pathZip)
Definition: Map.cs:750
virtual void OnSerializing()
Definition: Map.cs:143
List< Thing > _things
Definition: Map.cs:107
void _RemoveCard(Card t)
Definition: Map.cs:884
Zone zone
Definition: Map.cs:87
void RemoveLonelyRamps(Cell cell)
Definition: Map.cs:2056
void SetBlock(int x, int z, int idMat, int idBlock, int dir)
Definition: Map.cs:1023
T FindThing< T >()
Definition: Map.cs:2695
int _bits
Definition: Map.cs:22
void SetLiquid(int x, int z, int id, int value=1)
Definition: Map.cs:1532
TaskManager tasks
Definition: Map.cs:34
void ValidateInstalled(Point p)
Definition: Map.cs:2013
void DropBlockComponent(Point point, TileRow r, SourceMaterial.Row mat, bool recoverBlock, bool isPlatform=false, Chara c=null)
Definition: Map.cs:1673
MapExportSetting exportSetting
Definition: Map.cs:73
void SetEffect(int x, int z, CellEffect effect=null)
Definition: Map.cs:1554
void OnCardAddedToZone(Card t, int x, int z)
Definition: Map.cs:818
Version version
Definition: Map.cs:28
Thing FindThing(string workTag, BaseArea area1=null, BaseArea area2=null)
Definition: Map.cs:2754
FowProfile fowProfile
Definition: Map.cs:101
void ForeachNeighbor(Point center, Action< Point > action)
Definition: Map.cs:2480
bool isBreakerDown
Definition: Map.cs:110
MapConfig config
Definition: Map.cs:37
void OnSetBlockOrDoor(int x, int z)
Definition: Map.cs:1046
void Load(string path, bool import=false, PartialMap partial=null)
Definition: Map.cs:552
Chara FindChara(int uid)
Definition: Map.cs:2659
Playlist plNight
Definition: Map.cs:79
CellEffectManager effectManager
Definition: Map.cs:89
void ReloadRoom()
Definition: Map.cs:325
List< Point > ListPointsInLine(Point center, Point to, int radius, bool returnOnBlocked=true)
Definition: Map.cs:2385
Cell GetDependedRamp(Cell cell)
Definition: Map.cs:2236
PropsStocked Stocked
Definition: Map.cs:121
void MineRamp(Point point, int ramp, bool recoverBlock=false)
Definition: Map.cs:1781
void ValidateVersion()
Definition: Map.cs:715
List< Point > ListPointsInCircle(Point center, float radius, bool mustBeWalkable=true, bool los=true)
Definition: Map.cs:2324
void CreateNew(int size, bool setReference=true)
Definition: Map.cs:153
List< Chara > charas
Definition: Map.cs:81
void AddDecal(int x, int z, int id, int amount=1, bool refresh=true)
Definition: Map.cs:2075
void RevealAll(bool reveal=true)
Definition: Map.cs:918
IO.Compression compression
Definition: Map.cs:25
void SetObj(int x, int z, int idMat, int idObj, int value, int dir, bool ignoreRandomMat=false)
Definition: Map.cs:1586
void Resize(int newSize)
Definition: Map.cs:226
Dictionary< int, PlantData > plants
Definition: Map.cs:70
void RefreshAllTiles()
Definition: Map.cs:2154
void Quake()
Definition: Map.cs:2502
List< Chara > ListChara(Faction faction)
Definition: Map.cs:2585
List< TransAnime > pointAnimes
Definition: Map.cs:83
void RefreshShadow(int x, int z)
Definition: Map.cs:1846
void ApplyBackerObj(Point p, int id=-1)
Definition: Map.cs:1647
void SetObj(int x, int z, int id=0, int value=1, int dir=0)
Definition: Map.cs:1581
SourceBacker.Row GetBackerObj(Point p)
Definition: Map.cs:1638
static HashSet< int > sunMap
Definition: Map.cs:14
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
Definition: NoGoal.cs:4
Definition: POIMap.cs:4
IPathfinder pathfinder
Definition: PathManager.cs:24
static PathManager Instance
Definition: PathManager.cs:16
HashSet< int > doneBackers
Definition: Player.cs:1140
void ClearMapHighlights()
Definition: Player.cs:2518
Definition: Point.cs:9
static Point shared
Definition: Point.cs:20
SourceMaterial.Row matBlock
Definition: Point.cs:55
SourceMaterial.Row matFloor
Definition: Point.cs:57
int index
Definition: Point.cs:49
static Point Invalid
Definition: Point.cs:28
bool HasBridge
Definition: Point.cs:221
List< Card > ListCards(bool includeMasked=false)
Definition: Point.cs:1057
Point Copy()
Definition: Point.cs:491
bool IsSky
Definition: Point.cs:224
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
SourceMaterial.Row matBridge
Definition: Point.cs:59
void SetFloor(int idMat=0, int idFloor=0)
Definition: Point.cs:929
SoundSource PlaySound(string id, bool synced=true, float v=1f, bool spatial=true)
Definition: Point.cs:1259
SourceObj.Row sourceObj
Definition: Point.cs:69
bool Equals(int _x, int _z)
Definition: Point.cs:966
SourceFloor.Row sourceFloor
Definition: Point.cs:65
void SetBlock(int idMat=0, int idBlock=0)
Definition: Point.cs:924
bool IsValid
Definition: Point.cs:88
bool HasObj
Definition: Point.cs:137
bool HasRoomOrArea(BaseArea a)
Definition: Point.cs:421
Area area
Definition: Point.cs:73
bool HasFloor
Definition: Point.cs:219
int Distance(Point p)
Definition: Point.cs:995
Point Clamp(bool useBounds=false)
Definition: Point.cs:1014
bool IsInBounds
Definition: Point.cs:104
Cell cell
Definition: Point.cs:51
float GetAngle2(Point to)
Definition: Point.cs:618
void Animate(AnimeID id, bool animeBlock=false)
Definition: Point.cs:1308
SourceFloor.Row sourceBridge
Definition: Point.cs:67
bool IsPublicSpace()
Definition: Point.cs:449
PropsInstalled installed
Definition: PropsManager.cs:8
PropsRoaming roaming
Definition: PropsManager.cs:10
void OnCardAddedToZone(Card c)
Definition: PropsManager.cs:25
PropsStocked stocked
Definition: PropsManager.cs:6
TraitManager traits
Definition: Props.cs:18
List< Thing > things
Definition: Props.cs:20
Dictionary< string, PropSet > workMap
Definition: Props.cs:16
Definition: Rand.cs:4
static void SetSeed(int a=-1)
Definition: Rand.cs:44
static void BuildList()
static List< RecipeSource > list
static RecipeSource Get(string id)
RenderRow row
Definition: RecipeSource.cs:5
string GetIDIngredient()
string[] tag
Definition: RenderRow.cs:58
virtual string RecipeID
Definition: RenderRow.cs:105
TileType tileType
Definition: RenderRow.cs:77
string[] components
Definition: RenderRow.cs:52
Room AddRoom(Room r)
Definition: RoomManager.cs:110
void RefreshAll()
Definition: RoomManager.cs:43
void RemoveRoom(Room r)
Definition: RoomManager.cs:119
List< Room > listRoom
Definition: RoomManager.cs:13
List< Area > listArea
Definition: RoomManager.cs:10
void OnLoad()
Definition: RoomManager.cs:26
Definition: Room.cs:4
void SetDirty()
Definition: Room.cs:213
static SceneProfile Load(string id)
Definition: SceneProfile.cs:18
Definition: Scene.cs:8
ActionMode actionMode
Definition: Scene.cs:79
void AddActorEx(Card c, Action< ActorEx > onBeforeSetOwner=null)
Definition: Scene.cs:1022
void Init(Mode newMode)
Definition: Scene.cs:178
Mode
Definition: Scene.cs:10
void Restore(Map map, Map orgMap, bool addToZone, PartialMap partial=null)
List< Row > listRemain
List< Row > listTree
SourceMaterial materials
SourceObj objs
SourceBlock blocks
SourceBacker backers
SourceFloor floors
void AddBlood(Point p, int a=1)
string GetSoundDead(RenderRow c=null)
bool HasGrowth
Definition: SourceObj.cs:28
string matCategory
Definition: SourceObj.cs:23
virtual bool IsRegion
Definition: Spatial.cs:515
virtual string Name
Definition: Spatial.cs:509
bool OnMineWreck(Point point)
void OnLoad()
Definition: TaskManager.cs:66
Definition: Task.cs:4
static Thing CreateRawMaterial(SourceMaterial.Row m)
Definition: ThingGen.cs:68
static Thing CreateBlock(int id, int idMat)
Definition: ThingGen.cs:101
static Thing CreateFloor(int id, int idMat, bool platform=false)
Definition: ThingGen.cs:108
static Thing Create(string id, int idMat=-1, int lv=-1)
Definition: ThingGen.cs:53
Definition: Thing.cs:8
int stackOrder
Definition: Thing.cs:13
string alias
Definition: TileRow.cs:12
int id
Definition: TileRow.cs:8
virtual bool IsBlockPass
Definition: TileType.cs:159
virtual bool IsUnique
Definition: TraitChara.cs:34
TraitMap suns
Definition: TraitManager.cs:14
static Thing MakeSeed(string idSource)
Definition: TraitSeed.cs:105
Definition: Trait.cs:7
virtual string IDActorEx
Definition: Trait.cs:187
virtual List< Point > ListPoints(Point center=null, bool onlyPassable=true)
Definition: Trait.cs:864
virtual bool IsDoor
Definition: Trait.cs:58
virtual void OnAddedToZone()
Definition: Trait.cs:716
virtual bool CanCopyInBlueprint
Definition: Trait.cs:166
virtual void OnRemovedFromZone()
Definition: Trait.cs:720
virtual bool CanOnlyCarry
Definition: Trait.cs:305
static void UpdateMap(List< Cell > newPoints)
static void Say(string text, FontColor fontColor=FontColor.Default, Sprite sprite=null)
SerializedCards serializedCards
Definition: Zone.cs:12
void Revive()
Definition: Zone.cs:1199
virtual bool IsSkyLevel
Definition: Zone.cs:271
virtual bool DisableRooms
Definition: Zone.cs:123
virtual int MaxSoil
Definition: Zone.cs:520
virtual bool IsUserZone
Definition: Zone.cs:275
void RemoveCard(Card t)
Definition: Zone.cs:2130
override int DangerLv
Definition: Zone.cs:112
bool IsPCFaction
Definition: Zone.cs:477
virtual bool IsUnderwater
Definition: Zone.cs:273
int GetSoilCost()
Definition: Zone.cs:3928
Card AddCard(Card t, Point point)
Definition: Zone.cs:2090
void RemoveCard(Card c)
void Init(IPathfindGrid _grid, WeightCell[,] _weightMap, int size)
uint Bits
Definition: BitArray32.cs:6
int GetInt()
Definition: Version.cs:21