Elin Decompiled Documentation EA 23.102 Nightly
Loading...
Searching...
No Matches
BaseTileSelector.cs
Go to the documentation of this file.
1using System;
2using UnityEngine;
3
4public class BaseTileSelector : EMono
5{
6 public enum SelectType
7 {
8 Single,
10 None
11 }
12
13 public enum HitType
14 {
15 None,
16 Default,
17 Floor,
18 Block,
20 }
21
22 public enum BoxType
23 {
24 Box,
25 Fence
26 }
27
28 public enum ProcessMode
29 {
30 Render,
31 Prpcess,
33 }
34
36
37 public bool inspectorHighlight;
38
40
41 [NonSerialized]
42 public Point start;
43
44 [NonSerialized]
45 public Point temp = new Point();
46
47 [NonSerialized]
48 public Point lastPoint = new Point();
49
50 [NonSerialized]
51 public Point lastClickPoint = new Point();
52
53 [NonSerialized]
54 public bool processing;
55
56 [NonSerialized]
57 public bool autoClick;
58
59 public bool firstInMulti;
60
62
64
66
68
69 public int hitW => mode.hitW;
70
71 public int hitH => mode.hitH;
72
73 public bool multisize
74 {
75 get
76 {
77 if (hitW == 1)
78 {
79 return hitH != 1;
80 }
81 return true;
82 }
83 }
84
85 public int Width
86 {
87 get
88 {
90 {
91 if (start != null)
92 {
93 return Mathf.Abs(Scene.HitPoint.x - start.x) + 1;
94 }
95 return 1;
96 }
97 return 0;
98 }
99 }
100
101 public int Height
102 {
103 get
104 {
106 {
107 if (start != null)
108 {
109 return Mathf.Abs(Scene.HitPoint.z - start.z) + 1;
110 }
111 return 1;
112 }
113 return 0;
114 }
115 }
116
117 public void OnChangeActionMode()
118 {
119 start = null;
120 RefreshMouseInfo(force: true);
121 }
122
123 public virtual void OnRenderTile(Point point, HitResult result, bool shouldHide)
124 {
125 }
126
127 public void OnUpdate()
128 {
129 Point hitPoint = Scene.HitPoint;
131 {
132 RefreshMouseInfo(force: true);
133 }
135 {
136 autoClick = true;
137 }
139 {
140 autoClick = false;
141 if (start != null)
142 {
143 mode.OnSelectEnd(cancel: true);
144 start = null;
146 RefreshMouseInfo(force: true);
147 }
148 }
149 if (autoClick && hitPoint.Distance(lastClickPoint) > 1 && selectType == SelectType.Multiple && start != null)
150 {
151 start = hitPoint.Copy();
153 RefreshMouseInfo(force: true);
154 lastClickPoint.Set(hitPoint);
155 }
156 if (((EInput.rightScroll && EInput.rightMouse.clicked) || (!EInput.rightScroll && EInput.rightMouse.down) || Input.GetKeyDown(KeyCode.Escape)) && !EMono.ui.wasActive)
157 {
158 if (selectType == SelectType.Multiple && start != null)
159 {
160 mode.OnSelectEnd(cancel: true);
161 start = null;
163 RefreshMouseInfo(force: true);
164 }
165 else
166 {
167 mode.OnCancel();
168 }
169 EMono.ui.hud.hint.UpdateText();
170 }
171 if (!hitPoint.IsValid || EMono.ui.isPointerOverUI || EMono.ui.wasActive || mode.selectType == SelectType.None || !EMono.pc.ai.ShowCursor || (UIDragPanel.dragging && Input.GetMouseButton(0)))
172 {
173 return;
174 }
175 if (mode.hitType != 0)
176 {
177 if (mode.IsFillMode())
178 {
179 start = null;
180 ProcessFillTiles(hitPoint, ProcessMode.Render);
181 }
182 else
183 {
184 ProcessTiles(start ?? hitPoint, hitPoint, ProcessMode.Render);
185 }
186 }
187 if (start == null && (mode.AreaHihlight == AreaHighlightMode.Edit || mode.AreaHihlight == AreaHighlightMode.Sim) && hitPoint.area != null)
188 {
190 }
192 {
193 return;
194 }
195 if (start != null || hitPoint.IsSeen)
196 {
197 if (mode.IsFillMode())
198 {
199 TryProcessTiles(hitPoint);
200 }
201 else if (selectType == SelectType.Single)
202 {
203 HitResult hitResult = mode._HitTest(temp, start);
204 if ((hitResult == HitResult.Valid || hitResult == HitResult.Warning) && mode.CanProcessTiles())
205 {
206 TryProcessTiles(hitPoint);
207 }
208 else if (!autoClick)
209 {
210 SE.Beep();
211 }
212 }
213 else
214 {
215 if (start == null)
216 {
217 start = hitPoint.Copy();
219 RefreshMouseInfo(force: true);
220 if (autoClick)
221 {
222 TryProcessTiles(hitPoint);
223 }
224 }
225 else
226 {
227 TryProcessTiles(hitPoint);
228 }
229 if (autoClick)
230 {
231 start = hitPoint.Copy();
233 RefreshMouseInfo(force: true);
234 }
235 }
236 }
237 lastClickPoint.Set(hitPoint);
238 EMono.ui.hud.hint.UpdateText();
239 }
240
241 public void TryProcessTiles(Point _end)
242 {
243 if (EInput.skipFrame > 0)
244 {
245 return;
246 }
247 if (!mode.CanProcessTiles())
248 {
250 {
251 SE.Beep();
252 }
253 return;
254 }
255 Point point = _end.Copy();
256 ActionMode actionMode = mode;
258 if (mode.IsFillMode())
259 {
260 ProcessFillTiles(point, ProcessMode.Prpcess);
261 }
262 else if (start == null)
263 {
264 mode.OnProcessTiles(point, -1);
265 }
266 else
267 {
268 ProcessTiles(start, point, ProcessMode.Prpcess);
269 mode.OnSelectEnd(cancel: false);
270 }
271 if (mode == actionMode)
272 {
274 start = null;
276 RefreshMouseInfo(force: true);
278 }
279 }
280
281 public void ProcessTiles(Point start, Point end, ProcessMode processMode)
282 {
283 new Point();
284 int num = ((start.x > end.x) ? start.x : end.x);
285 int num2 = ((start.z < end.z) ? start.z : end.z);
286 int num3 = ((start.x > end.x) ? end.x : start.x);
287 int num4 = ((start.z < end.z) ? end.z : start.z);
288 int num5 = num - num3 + 1;
289 int num6 = num4 - num2 + 1;
290 BoxType boxType = this.boxType;
291 int num7 = -1;
292 int num8 = 0;
293 firstInMulti = false;
294 if (multisize && selectType == SelectType.Single && processMode != ProcessMode.Prpcess)
295 {
296 num3 -= hitW - 1;
297 num4 += hitH - 1;
298 num5 += hitW - 1;
299 num6 += hitH - 1;
300 }
301 if (processMode == ProcessMode.Prpcess)
302 {
303 processing = true;
304 }
305 for (int num9 = num; num9 > num3 - 1; num9--)
306 {
307 for (int i = num2; i < num4 + 1; i++)
308 {
309 if (boxType == BoxType.Fence && (num5 > 1 || num6 > 1))
310 {
311 num7 = ((num5 <= num6) ? 1 : 0);
312 if ((num7 == 0 && i != start.z) || (num7 == 1 && num9 != start.x))
313 {
314 continue;
315 }
316 }
317 temp.Set(num9, i);
318 if (start.x != num9 || start.z != i)
319 {
320 _ProcessTile(start, temp, processMode, num7);
321 }
322 }
323 num8++;
324 if (num8 > 30000)
325 {
326 Debug.Log(num8);
327 break;
328 }
329 }
330 firstInMulti = true;
331 _ProcessTile(start, start, processMode, num7);
332 processing = false;
333 }
334
335 public void ProcessFillTiles(Point start, ProcessMode processMode)
336 {
337 EMono._map.ForeachPoint(delegate(Point dest)
338 {
339 if (!start.Equals(dest))
340 {
341 _ProcessTile(start, dest, processMode);
342 }
343 });
344 _ProcessTile(start, start, processMode);
345 }
346
347 private void _ProcessTile(Point start, Point dest, ProcessMode processMode, int dir = -1)
348 {
349 if (!dest.IsValid)
350 {
351 return;
352 }
353 HitResult hitResult = mode._HitTest(dest, start);
354 switch (processMode)
355 {
356 case ProcessMode.Render:
357 mode.OnRenderTile(dest, hitResult, dir);
358 firstInMulti = false;
359 break;
360 case ProcessMode.Prpcess:
361 if (hitResult == HitResult.Valid || hitResult == HitResult.Warning)
362 {
363 mode.OnProcessTiles(dest, dir);
364 }
365 break;
366 case ProcessMode.Summary:
367 mode.OnRefreshSummary(dest, hitResult, summary);
368 break;
369 }
370 }
371
372 public bool IsInRange(int x, int z, Point end)
373 {
374 if (start.x > end.x)
375 {
376 if (x > start.x || x < end.x)
377 {
378 return false;
379 }
380 }
381 else if (x < start.x || x > end.x)
382 {
383 return false;
384 }
385 if (start.z > end.z)
386 {
387 if (z > start.z || z < end.z)
388 {
389 return false;
390 }
391 }
392 else if (z < start.z || z > end.z)
393 {
394 return false;
395 }
396 return true;
397 }
398
399 public void RefreshMouseInfo(bool force = false)
400 {
401 bool enable = true;
402 Point hitPoint = Scene.HitPoint;
403 if (EMono.ui.IsActive || EMono.ui.isPointerOverUI || !mode.enableMouseInfo || !hitPoint.IsValid)
404 {
405 enable = false;
406 }
407 else if (!hitPoint.Equals(lastPoint) || force)
408 {
409 if (start != null && !hitPoint.Equals(lastPoint))
410 {
411 SE.Play("highlight3");
412 }
414 string text = "";
415 int num = 0;
416 if (start != null)
417 {
418 int num2 = Mathf.Abs(hitPoint.x - start.x) + 1;
419 int num3 = Mathf.Abs(hitPoint.z - start.z) + 1;
420 if (!hitPoint.IsValid)
421 {
422 num2 = 0;
423 num3 = 0;
424 }
425 text = text + "(" + num2 + " x " + num3 + ")";
426 }
427 else if (selectType == SelectType.Multiple)
428 {
429 text += "selectRange".lang();
430 }
431 if (selectType == SelectType.Single)
432 {
433 num = mode.CostMoney;
434 }
435 else if (start != null)
436 {
437 num = summary.money;
438 }
439 EMono.ui.mouseInfo.textCost.SetActive(num != 0);
440 if (num != 0)
441 {
442 EMono.ui.mouseInfo.textCost.text = num.ToString() ?? "";
443 }
444 if (mode.TopHeight(hitPoint) != -1)
445 {
446 text += "hintAltitude".lang(mode.TopHeight(hitPoint).ToString() ?? "");
447 }
449 {
450 AM_Picker.Result result = ActionMode.Picker.Test(hitPoint);
451 if (result.IsValid)
452 {
453 text += result.GetText();
454 }
455 }
456 if (mode.IsRoofEditMode())
457 {
458 text = text + Environment.NewLine + "roofEdit".lang();
459 }
460 else if (mode.IsFillMode())
461 {
462 text = text + Environment.NewLine + "fillMode".lang();
463 }
464 text += "\n";
465 EMono.ui.mouseInfo.text.SetText(mode.SetMouseInfo(ref text));
466 }
467 EMono.ui.mouseInfo.SetActive(enable);
468 lastPoint.Set(hitPoint);
469 }
470
471 public void ExecuteSummary()
472 {
473 if ((bool)BuildMenu.Instance)
474 {
479 }
480 }
481
482 public void RefreshSummary()
483 {
484 Point hitPoint = Scene.HitPoint;
485 summary.Clear();
486 ProcessTiles(start ?? hitPoint, hitPoint, ProcessMode.Summary);
487 if ((bool)BuildMenu.Instance)
488 {
490 }
491 }
492}
AreaHighlightMode
HitResult
Definition: HitResult.cs:2
virtual bool ShowCursor
Definition: AIAct.cs:92
Result Test(Point point, bool select=false)
Definition: AM_Picker.cs:120
virtual void OnCancel()
Definition: ActionMode.cs:538
virtual void OnBeforeProcessTiles()
Definition: ActionMode.cs:1327
static AM_Picker Picker
Definition: ActionMode.cs:43
virtual bool IsRoofEditMode(Card c=null)
Definition: ActionMode.cs:311
virtual bool AllowAutoClick
Definition: ActionMode.cs:163
virtual int hitW
Definition: ActionMode.cs:131
virtual int hitH
Definition: ActionMode.cs:133
virtual void OnRefreshSummary(Point point, HitResult result, HitSummary summary)
Definition: ActionMode.cs:1343
virtual BaseTileSelector.SelectType selectType
Definition: ActionMode.cs:125
virtual void OnFinishProcessTiles()
Definition: ActionMode.cs:1339
virtual void OnSelectEnd(bool cancel)
Definition: ActionMode.cs:1259
HitResult _HitTest(Point point, Point start)
Definition: ActionMode.cs:1233
virtual AreaHighlightMode AreaHihlight
Definition: ActionMode.cs:169
virtual void OnSelectStart(Point point)
Definition: ActionMode.cs:1255
virtual void SEExecuteSummary()
Definition: ActionMode.cs:292
virtual void OnAfterProcessTiles(Point start, Point end)
Definition: ActionMode.cs:1335
virtual bool CanSelectTile
Definition: ActionMode.cs:171
bool IsActive
Definition: ActionMode.cs:121
virtual ref string SetMouseInfo(ref string s)
Definition: ActionMode.cs:1440
virtual bool CanProcessTiles()
Definition: ActionMode.cs:1318
virtual BaseTileSelector.BoxType boxType
Definition: ActionMode.cs:127
virtual bool ContinuousClick
Definition: ActionMode.cs:129
virtual BaseTileSelector.HitType hitType
Definition: ActionMode.cs:123
virtual int CostMoney
Definition: ActionMode.cs:211
virtual bool enableMouseInfo
Definition: ActionMode.cs:157
virtual void OnRenderTile(Point point, HitResult result, int dir)
Definition: ActionMode.cs:1272
static AM_Adv Adv
Definition: ActionMode.cs:15
virtual bool IsFillMode()
Definition: ActionMode.cs:316
virtual int TopHeight(Point p)
Definition: ActionMode.cs:287
virtual void OnProcessTiles(Point point, int dir)
Definition: ActionMode.cs:1331
void OnHoverArea(MeshPass pass)
Definition: Area.cs:67
ScreenGuide guide
BaseTileSelector tileSelector
void RefreshMouseInfo(bool force=false)
void ProcessFillTiles(Point start, ProcessMode processMode)
bool IsInRange(int x, int z, Point end)
void TryProcessTiles(Point _end)
virtual void OnRenderTile(Point point, HitResult result, bool shouldHide)
void _ProcessTile(Point start, Point dest, ProcessMode processMode, int dir=-1)
void ProcessTiles(Point start, Point end, ProcessMode processMode)
SelectType selectType
static BuildMenu Instance
Definition: BuildMenu.cs:77
UIRecipeInfo info1
Definition: BuildMenu.cs:27
bool pressing
Definition: ButtonState.cs:35
bool clicked
Definition: ButtonState.cs:37
bool pressedLong
Definition: ButtonState.cs:64
AIAct ai
Definition: Chara.cs:187
Definition: EInput.cs:8
static bool rightScroll
Definition: EInput.cs:363
static ButtonState leftMouse
Definition: EInput.cs:349
static ButtonState rightMouse
Definition: EInput.cs:351
static int skipFrame
Definition: EInput.cs:287
Definition: EMono.cs:4
static Chara pc
Definition: EMono.cs:13
static BaseGameScreen screen
Definition: EMono.cs:29
static Scene scene
Definition: EMono.cs:27
static UI ui
Definition: EMono.cs:15
static Map _map
Definition: EMono.cs:17
void Clear()
Definition: HitSummary.cs:22
void Execute()
Definition: HitSummary.cs:104
int money
Definition: HitSummary.cs:6
new void ForeachPoint(Action< Point > action)
Definition: Map.cs:2335
Definition: Point.cs:9
bool IsSeen
Definition: Point.cs:318
Point Copy()
Definition: Point.cs:467
Point Set(int _x, int _z)
Definition: Point.cs:479
int x
Definition: Point.cs:36
int z
Definition: Point.cs:39
bool Equals(int _x, int _z)
Definition: Point.cs:924
bool IsValid
Definition: Point.cs:88
Area area
Definition: Point.cs:73
int Distance(Point p)
Definition: Point.cs:953
Definition: Scene.cs:8
static Point HitPoint
Definition: Scene.cs:21
ActionMode actionMode
Definition: Scene.cs:77
MeshPass passArea
Definition: ScreenGuide.cs:9
static bool dragging
Definition: UIDragPanel.cs:7
void RefreshBalance()
void Refresh()
string GetText()
Definition: AM_Picker.cs:18