Elin Modding Docs Doc
All Classes Namespaces
Los.cs
1using System;
2using System.Collections.Generic;
3
4// Token: 0x020000A4 RID: 164
5public class Los : EClass
6{
7 // Token: 0x06000458 RID: 1112 RVA: 0x0001D2D0 File Offset: 0x0001B4D0
8 public static int MAX(int a, int b)
9 {
10 if (a <= b)
11 {
12 return b;
13 }
14 return a;
15 }
16
17 // Token: 0x06000459 RID: 1113 RVA: 0x0001D2D9 File Offset: 0x0001B4D9
18 public static int ABS(int a)
19 {
20 if (a >= 0)
21 {
22 return a;
23 }
24 return -a;
25 }
26
27 // Token: 0x0600045A RID: 1114 RVA: 0x0001D2E3 File Offset: 0x0001B4E3
28 public static int ZSGN(int a)
29 {
30 if (a < 0)
31 {
32 return -1;
33 }
34 if (a <= 0)
35 {
36 return 0;
37 }
38 return 1;
39 }
40
41 // Token: 0x0600045B RID: 1115 RVA: 0x0001D2F4 File Offset: 0x0001B4F4
42 private static bool IsBlocked(int x, int z, int sx, int sz)
43 {
44 bool flag = false;
45 if (x < 0 || z < 0 || x >= EClass._map.Size || z >= EClass._map.Size)
46 {
47 flag = true;
48 }
49 else
50 {
51 Cell cell = EClass._map.cells[x, z];
52 byte[] weights = EClass._map.cells[x, z].weights;
53 if ((sz == -1 && weights[0] == 0) || (sz == 1 && weights[2] == 0) || (sx == 1 && weights[1] == 0) || (sx == -1 && weights[3] == 0))
54 {
55 flag = true;
56 }
57 if (!flag && sx != 0 && sz != 0)
58 {
59 if (x + sx < 0 || z + sz < 0 || x + sx >= EClass._map.Size || z + sz >= EClass._map.Size)
60 {
61 flag = true;
62 }
63 else
64 {
65 byte[] weights2 = EClass._map.cells[x + sx, z + sz].weights;
66 if ((sz < 0 && weights2[2] == 0) || (sx > 0 && weights2[3] == 0))
67 {
68 flag = true;
69 }
70 if ((sz > 0 && weights2[0] == 0) || (sx < 0 && weights2[1] == 0))
71 {
72 flag = true;
73 }
74 }
75 }
76 if (cell.blockSight)
77 {
78 flag = true;
79 }
80 }
81 Los.p.Set(x, z);
82 if (Los.onVisit != null)
83 {
84 Los.onVisit(Los.p, flag);
85 }
86 return flag;
87 }
88
89 // Token: 0x0600045C RID: 1116 RVA: 0x0001D424 File Offset: 0x0001B624
90 public static List<Point> ListVisible(Point p1, Point p2, int radius, Action<Point, bool> _onVisit = null)
91 {
92 List<Point> list = new List<Point>();
93 List<Point> vecs = new List<Point>();
94 Point lastPoint = p1.Copy();
95 Los.IsVisible(p1.x, p2.x, p1.z, p2.z, delegate(Point p, bool blocked)
96 {
97 Point point3 = new Point(p.x - lastPoint.x, p.z - lastPoint.z);
98 if (point3.x != 0 || point3.z != 0)
99 {
100 vecs.Add(point3);
101 }
102 lastPoint.Set(p);
103 }, false);
104 if (vecs.Count == 0)
105 {
106 return list;
107 }
108 Point point = p1.Copy();
109 for (int i = 0; i < radius; i++)
110 {
111 Point point2 = vecs[i % vecs.Count];
112 point.x += point2.x;
113 point.z += point2.z;
114 }
115 Los.IsVisible(p1.x, point.x, p1.z, point.z, delegate(Point p, bool blocked)
116 {
117 if (!blocked)
118 {
119 list.Add(p.Copy());
120 }
121 if (_onVisit != null)
122 {
123 _onVisit(p, blocked);
124 }
125 }, true);
126 return list;
127 }
128
129 // Token: 0x0600045D RID: 1117 RVA: 0x0001D524 File Offset: 0x0001B724
130 public static Point GetNearestNeighbor(Point p1, Point p2)
131 {
132 Point dest = null;
133 Los.IsVisible(p1, p2, delegate(Point p, bool blocked)
134 {
135 if (!blocked && dest == null && p2.Distance(p) == 1 && !p.HasChara)
136 {
137 dest = new Point(p);
138 }
139 });
140 return dest;
141 }
142
143 // Token: 0x0600045E RID: 1118 RVA: 0x0001D564 File Offset: 0x0001B764
144 public static Point GetRushPoint(Point p1, Point dest)
145 {
146 Point rushPos = null;
147 bool valid = true;
148 Los.IsVisible(p1, dest, delegate(Point p, bool blocked)
149 {
150 if (p.Equals(dest) || p.Equals(p1))
151 {
152 return;
153 }
154 if (blocked || p.HasChara || p.IsBlocked)
155 {
156 valid = false;
157 }
158 if (p.Distance(dest) == 1)
159 {
160 rushPos = p.Copy();
161 }
162 });
163 if (!valid)
164 {
165 return null;
166 }
167 return rushPos;
168 }
169
170 // Token: 0x0600045F RID: 1119 RVA: 0x0001D5C1 File Offset: 0x0001B7C1
171 public static bool IsVisible(Point p1, Point p2, Action<Point, bool> _onVisit = null)
172 {
173 return Los.IsVisible(p1.x, p2.x, p1.z, p2.z, _onVisit, true);
174 }
175
176 // Token: 0x06000460 RID: 1120 RVA: 0x0001D5E2 File Offset: 0x0001B7E2
177 public static bool IsVisible(Card c1, Card c2)
178 {
179 return Los.IsVisible(c1.pos.x, c2.pos.x, c1.pos.z, c2.pos.z, null, true);
180 }
181
182 // Token: 0x06000461 RID: 1121 RVA: 0x0001D618 File Offset: 0x0001B818
183 public static bool IsVisible(int x1, int x2, int z1, int z2, Action<Point, bool> _onVisit = null, bool returnOnBlock = true)
184 {
185 Los.onVisit = _onVisit;
186 Los.p.Set(x1, z1);
187 Los.originalP.Set(x1, z1);
188 int a = x2 - x1;
189 int a2 = z2 - z1;
190 int num = Los.ABS(a) << 1;
191 int num2 = Los.ABS(a2) << 1;
192 int num3 = Los.ZSGN(a);
193 int num4 = Los.ZSGN(a2);
194 int num5 = x1;
195 int num6 = z1;
196 if (num >= num2)
197 {
198 int num7 = num2 - (num >> 1);
199 while (num5 != x2)
200 {
201 if (Los.IsBlocked(num5, num6, num3, (num7 >= 0) ? num4 : 0) && returnOnBlock)
202 {
203 return false;
204 }
205 if (num7 >= 0)
206 {
207 num6 += num4;
208 num7 -= num;
209 }
210 num5 += num3;
211 num7 += num2;
212 }
213 Los.p.Set(num5, num6);
214 if (Los.onVisit != null)
215 {
216 Los.onVisit(Los.p, false);
217 }
218 return true;
219 }
220 if (num2 >= num)
221 {
222 int num8 = num - (num2 >> 1);
223 while (num6 != z2)
224 {
225 if (Los.IsBlocked(num5, num6, (num8 >= 0) ? num3 : 0, num4) && returnOnBlock)
226 {
227 return false;
228 }
229 if (num8 >= 0)
230 {
231 num5 += num3;
232 num8 -= num2;
233 }
234 num6 += num4;
235 num8 += num;
236 }
237 Los.p.Set(num5, num6);
238 if (Los.onVisit != null)
239 {
240 Los.onVisit(Los.p, false);
241 }
242 return true;
243 }
244 return false;
245 }
246
247 // Token: 0x040005DF RID: 1503
248 public static Point p = new Point();
249
250 // Token: 0x040005E0 RID: 1504
251 public static Point originalP = new Point();
252
253 // Token: 0x040005E1 RID: 1505
254 public static Action<Point, bool> onVisit;
255}
Definition Card.cs:13
Definition Cell.cs:10
Definition Los.cs:6
Definition Point.cs:11