Elin Decompiled Documentation EA 23.102 Nightly
Loading...
Searching...
No Matches
Fov.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using UnityEngine;
4
5public class Fov : EClass
6{
7 public struct LevelPoint
8 {
9 public int X;
10
11 public int Y;
12 }
13
14 public static float nonGradientMod;
15
16 public static List<Cell> newPoints = new List<Cell>();
17
18 public static Map map;
19
20 public static LevelPoint origin = default(LevelPoint);
21
22 public static int range;
23
24 public static float _power;
25
26 public byte r;
27
28 public byte g;
29
30 public byte b;
31
32 public bool isPC;
33
34 public bool limitGradient;
35
36 public Dictionary<int, byte> lastPoints = new Dictionary<int, byte>();
37
38 private static int x;
39
40 private static int y;
41
42 public void SetVisible(int x, int y)
43 {
44 Cell cell = map.cells[x, y];
45 if (cell.light > 100 && !isPC)
46 {
47 return;
48 }
49 int key = x + y * map.Size;
50 if (isPC && !cell.outOfBounds)
51 {
52 cell.pcSync = true;
53 }
54 if (_power < 0.1f)
55 {
56 lastPoints[key] = 0;
57 return;
58 }
59 float num = GetVisDistance(x, y, origin.X, origin.Y);
60 float power = _power;
61 if (limitGradient)
62 {
63 power *= nonGradientMod;
64 if (num >= (float)range)
65 {
66 power *= EClass.scene.profile.global.edgeLight;
67 }
68 }
69 else
70 {
71 if (num <= 1f)
72 {
73 num = 1f;
74 }
75 power *= (float)(range + 1) - num;
76 }
77 if (power < 1f)
78 {
79 power = 1f;
80 }
81 else if (power > 20f)
82 {
83 power = 20f;
84 }
85 if (cell.outOfBounds)
86 {
87 if (isPC && (power > 0f || GetVisDistance(origin.X, origin.Y, x, y) < 4f))
88 {
89 cell.isSeen = true;
90 }
91 power = 0f;
92 }
93 lastPoints[key] = (byte)power;
94 }
95
96 public void ClearVisible()
97 {
98 foreach (KeyValuePair<int, byte> lastPoint in lastPoints)
99 {
100 Cell cell = map.GetCell(lastPoint.Key);
101 byte value = lastPoint.Value;
102 cell.light -= value;
103 cell.lightR -= (ushort)(value * r / 2);
104 cell.lightG -= (ushort)(value * g / 2);
105 cell.lightB -= (ushort)(value * b / 2);
106 if (isPC)
107 {
108 cell.pcSync = false;
109 }
110 }
111 lastPoints.Clear();
112 }
113
114 public List<Point> ListPoints()
115 {
116 List<Point> list = new List<Point>();
117 foreach (KeyValuePair<int, byte> lastPoint in lastPoints)
118 {
119 list.Add(new Point(lastPoint.Key));
120 }
121 return list;
122 }
123
124 private float GetVisDistance(int x1, int y1, int x2, int y2)
125 {
126 return Mathf.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
127 }
128
129 public static float DistanceFloat(int x1, int y1, int x2, int y2)
130 {
131 return Mathf.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
132 }
133
134 public static int Distance(int x1, int y1, int x2, int y2)
135 {
136 return (int)Mathf.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
137 }
138
139 public void Perform(int _x, int _z, int _range, float power = 1f)
140 {
141 range = _range;
142 ClearVisible();
143 if (range == 0)
144 {
145 return;
146 }
147 _power = power;
148 origin.X = _x;
149 origin.Y = _z;
151 int num = origin.X - range;
152 if (num < 0)
153 {
154 num = 0;
155 }
156 int num2 = origin.Y - range;
157 if (num2 < 0)
158 {
159 num2 = 0;
160 }
161 int num3 = origin.X + range + 1;
162 if (num3 >= EClass._map.Size)
163 {
164 num3 = EClass._map.Size;
165 }
166 int num4 = origin.Y + range + 1;
167 if (num4 >= EClass._map.Size)
168 {
169 num4 = EClass._map.Size;
170 }
171 for (int i = num; i < num3; i++)
172 {
173 TraceLine(i, num2);
174 TraceLine(i, num4 - 1);
175 }
176 for (int j = num2 + 1; j < num4 - 1; j++)
177 {
178 TraceLine(num, j);
179 TraceLine(num3 - 1, j);
180 }
181 if (range >= 6)
182 {
183 int max = EClass._map.Size - 1;
184 int x = (origin.X + 4).ClampMax(max);
185 int y = (origin.Y + 1).ClampMax(max);
186 int x2 = (origin.X - 4).ClampMin(0);
187 int y2 = (origin.Y - 1).ClampMin(0);
188 int x3 = (origin.X + 1).ClampMax(max);
189 int y3 = (origin.Y + 4).ClampMax(max);
190 int x4 = (origin.X - 1).ClampMin(0);
191 int y4 = (origin.Y - 4).ClampMin(0);
192 TraceLine(x, y);
193 TraceLine(x, y2);
194 TraceLine(x2, y);
195 TraceLine(x2, y2);
196 TraceLine(x3, y3);
197 TraceLine(x3, y4);
198 TraceLine(x4, y3);
199 TraceLine(x4, y4);
200 }
201 foreach (KeyValuePair<int, byte> lastPoint in lastPoints)
202 {
203 Cell cell = map.GetCell(lastPoint.Key);
204 byte value = lastPoint.Value;
205 cell.light += value;
206 cell.lightR += (ushort)(value * r / 2);
207 cell.lightG += (ushort)(value * g / 2);
208 cell.lightB += (ushort)(value * b / 2);
209 if (isPC && (value > 0 || GetVisDistance(origin.X, origin.Y, cell.x, cell.z) < 2f) && !cell.isSeen && (!cell.HasWall || EClass._zone.UseFog || cell.room == EClass.pc.Cell.room || cell.hasDoor))
210 {
211 EClass._map.SetSeen(cell.x, cell.z);
212 newPoints.Add(cell);
213 }
214 }
215 if (isPC && newPoints.Count > 0)
216 {
218 }
219 }
220
221 private void TraceLine(int x2, int y2)
222 {
223 int value = x2 - origin.X;
224 int value2 = y2 - origin.Y;
225 int num = Math.Abs(value);
226 int num2 = Math.Abs(value2);
227 int num3 = Math.Sign(value);
228 int num4 = Math.Sign(value2) << 16;
229 int num5 = (origin.Y << 16) + origin.X;
230 if (num < num2)
231 {
232 int num6 = num;
233 num = num2;
234 num2 = num6;
235 int num7 = num3;
236 num3 = num4;
237 num4 = num7;
238 }
239 int num8 = num2 * 2;
240 int num9 = -num;
241 int num10 = num * 2;
242 while (--num >= 0)
243 {
244 num5 += num3;
245 num9 += num8;
246 if (num9 > 0)
247 {
248 num9 -= num10;
249 num5 += num4;
250 }
251 x = num5 & 0xFFFF;
252 y = num5 >> 16;
253 int num11 = (int)GetVisDistance(origin.X, origin.Y, x, y);
254 if (range < 0 || num11 <= range)
255 {
256 SetVisible(x, y);
257 if (map.cells[x, y].blockSight)
258 {
259 break;
260 }
261 continue;
262 }
263 break;
264 }
265 }
266}
if(item3.idFile==idFirstFile &&item3.id==idFirstTopic)
Definition: UIBook.cs:627
Cell Cell
Definition: Card.cs:1931
Definition: Cell.cs:7
Room room
Definition: Cell.cs:102
bool HasWall
Definition: Cell.cs:833
bool blockSight
Definition: Cell.cs:318
byte light
Definition: Cell.cs:60
byte z
Definition: Cell.cs:58
bool isSeen
Definition: Cell.cs:282
bool outOfBounds
Definition: Cell.cs:414
byte x
Definition: Cell.cs:56
bool hasDoor
Definition: Cell.cs:258
Definition: EClass.cs:5
static Scene scene
Definition: EClass.cs:30
static Zone _zone
Definition: EClass.cs:20
static Map _map
Definition: EClass.cs:18
static Chara pc
Definition: EClass.cs:14
Definition: Fov.cs:6
static List< Cell > newPoints
Definition: Fov.cs:16
bool isPC
Definition: Fov.cs:32
bool limitGradient
Definition: Fov.cs:34
void SetVisible(int x, int y)
Definition: Fov.cs:42
static int y
Definition: Fov.cs:40
byte b
Definition: Fov.cs:30
static LevelPoint origin
Definition: Fov.cs:20
void ClearVisible()
Definition: Fov.cs:96
float GetVisDistance(int x1, int y1, int x2, int y2)
Definition: Fov.cs:124
static float nonGradientMod
Definition: Fov.cs:14
List< Point > ListPoints()
Definition: Fov.cs:114
static float DistanceFloat(int x1, int y1, int x2, int y2)
Definition: Fov.cs:129
byte g
Definition: Fov.cs:28
static int Distance(int x1, int y1, int x2, int y2)
Definition: Fov.cs:134
Dictionary< int, byte > lastPoints
Definition: Fov.cs:36
void TraceLine(int x2, int y2)
Definition: Fov.cs:221
static Map map
Definition: Fov.cs:18
static float _power
Definition: Fov.cs:24
void Perform(int _x, int _z, int _range, float power=1f)
Definition: Fov.cs:139
static int range
Definition: Fov.cs:22
byte r
Definition: Fov.cs:26
static int x
Definition: Fov.cs:38
int Size
Definition: MapBounds.cs:20
Definition: Map.cs:13
Cell GetCell(int index)
Definition: Map.cs:881
void SetSeen(int x, int z, bool seen=true, bool refresh=true)
Definition: Map.cs:886
Cell[,] cells
Definition: Map.cs:85
Definition: Point.cs:9
SceneGlobalProfile global
Definition: SceneProfile.cs:6
SceneProfile profile
Definition: Scene.cs:73
static void UpdateMap(List< Cell > newPoints)
virtual bool UseFog
Definition: Zone.cs:384
int X
Definition: Fov.cs:9
int Y
Definition: Fov.cs:11