Elin Decompiled Documentation EA 23.321 Nightly Patch 1
Loading...
Searching...
No Matches
TaskWater.cs
Go to the documentation of this file.
1using System.Collections.Generic;
2using UnityEngine;
3
4public class TaskWater : Task
5{
6 public Point dest;
7
8 public TraitToolWaterCan waterCan => (owner ?? Act.CC)?.held?.trait as TraitToolWaterCan;
9
10 public override string GetText(string str = "")
11 {
12 if (dest == null || !dest.cell.HasFire)
13 {
14 return base.GetText(str);
15 }
16 return "TaskWaterFire".lang();
17 }
18
19 public override bool CanPerform()
20 {
21 if (ShouldWater(Act.TP))
22 {
23 return IsWaterCanValid(msg: false);
24 }
25 return false;
26 }
27
28 public override bool CanManualCancel()
29 {
30 return true;
31 }
32
33 public override IEnumerable<Status> Run()
34 {
35 dest = new Point(dest);
36 List<Point> list = ListPoints();
37 while (list.Count != 0)
38 {
39 Debug.Log(list.Count);
40 list.Sort((Point a, Point b) => a.Distance(dest) - b.Distance(dest));
41 Point p2 = list[0];
42 dest.Set(p2);
43 list.RemoveAt(0);
44 if (!ShouldWater(p2))
45 {
46 continue;
47 }
48 if (!IsWaterCanValid())
49 {
50 yield return Cancel();
51 }
52 bool fail = false;
53 Status status = DoGoto(p2, 1, ignoreConnection: false, delegate
54 {
55 fail = true;
56 return Status.Running;
57 });
58 if (fail || status == Status.Fail)
59 {
60 continue;
61 }
62 yield return Status.Running;
63 if (!IsWaterCanValid())
64 {
65 yield return Cancel();
66 }
67 if (!ShouldWater(p2))
68 {
69 continue;
70 }
71 if (owner.Dist(dest) > 1)
72 {
73 yield return Cancel();
74 }
75 int num = waterCan.owner.Evalue(770);
76 num = ((num <= 0) ? 1 : Mathf.Min(waterCan.owner.c_charges, 2 + num / 10));
77 if (num > 1)
78 {
79 List<Point> list2 = EClass._map.ListPointsInSquare(p2, num - 1, mustBeWalkable: false, los: false);
80 list2.Sort((Point a, Point b) => a.Distance(p2) - b.Distance(p2));
81 foreach (Point item in list2)
82 {
83 Water(item);
84 }
85 }
86 else
87 {
88 Water(p2);
89 }
90 owner.PlaySound("water_farm");
91 owner.Say("water_farm", owner, p2.cell.GetFloorName());
93 if (!IsWaterCanValid())
94 {
95 yield return Cancel();
96 }
97 yield return KeepRunning();
98 }
99 void Water(Point p)
100 {
101 p.cell.isWatered = true;
102 if (!p.cell.blocked && EClass.rnd(5) == 0)
103 {
104 EClass._map.SetLiquid(p.x, p.z, 1);
105 }
106 if (p.cell.HasFire)
107 {
108 p.ModFire(-50, extinguish: true);
109 }
110 owner.ModExp(286, 15);
111 }
112 }
113
114 public static bool ShouldWater(Point p)
115 {
116 Cell cell = p.cell;
117 if (cell.HasFire)
118 {
119 return true;
120 }
121 if (cell.isWatered || cell.IsTopWater || cell.IsSnowTile || !p.IsFarmField)
122 {
123 return false;
124 }
125 if (p.cell.detail != null)
126 {
127 foreach (Thing thing in p.Things)
128 {
129 if (thing.trait is TraitSeed)
130 {
131 return true;
132 }
133 }
134 }
135 return p.growth != null;
136 }
137
138 public bool IsWaterCanValid(bool msg = true)
139 {
140 bool num = waterCan != null && waterCan.owner.c_charges > 0;
141 if (!num && msg)
142 {
143 Msg.Say("water_deplete");
144 }
145 return num;
146 }
147
148 public List<Point> ListPoints()
149 {
150 List<Point> list = new List<Point>();
152 {
153 if (ShouldWater(p))
154 {
155 list.Add(p.Copy());
156 }
157 });
158 return list;
159 }
160}
Status status
Definition: AIAct.cs:16
new Chara owner
Definition: AIAct.cs:14
Status
Definition: AIAct.cs:8
Status DoGoto(Point pos, int dist=0, bool ignoreConnection=false, Func< Status > _onChildFail=null)
Definition: AIAct.cs:446
Status KeepRunning()
Definition: AIAct.cs:335
Definition: ACT.cs:62
static Point TP
Definition: ACT.cs:81
static Chara CC
Definition: ACT.cs:77
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6578
Trait trait
Definition: Card.cs:54
void ModCharge(int a, bool destroy=false)
Definition: Card.cs:4124
int Evalue(int ele)
Definition: Card.cs:2704
int Dist(Card c)
Definition: Card.cs:8131
void ModExp(string alias, int a)
Definition: Card.cs:2781
int c_charges
Definition: Card.cs:1309
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:7256
Definition: Cell.cs:7
bool IsSnowTile
Definition: Cell.cs:790
bool IsTopWater
Definition: Cell.cs:708
bool isWatered
Definition: Cell.cs:350
CellDetail detail
Definition: Cell.cs:100
string GetFloorName()
Definition: Cell.cs:1630
bool HasFire
Definition: Cell.cs:684
Definition: EClass.cs:6
static Map _map
Definition: EClass.cs:19
static int rnd(long a)
Definition: EClass.cs:59
void ForeachPoint(Action< Point > action)
Definition: MapBounds.cs:291
void SetLiquid(int x, int z, CellEffect effect=null)
Definition: Map.cs:1522
List< Point > ListPointsInSquare(Point center, int radius, bool mustBeWalkable=true, bool los=true)
Definition: Map.cs:2336
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: Point.cs:9
Point Copy()
Definition: Point.cs:491
Point Set(int _x, int _z)
Definition: Point.cs:503
List< Thing > Things
Definition: Point.cs:338
int x
Definition: Point.cs:36
void ModFire(int value, bool extinguish=false)
Definition: Point.cs:939
int z
Definition: Point.cs:39
bool IsFarmField
Definition: Point.cs:127
int Distance(Point p)
Definition: Point.cs:995
Cell cell
Definition: Point.cs:51
static bool ShouldWater(Point p)
Definition: TaskWater.cs:114
TraitToolWaterCan waterCan
Definition: TaskWater.cs:8
override IEnumerable< Status > Run()
Definition: TaskWater.cs:33
override string GetText(string str="")
Definition: TaskWater.cs:10
bool IsWaterCanValid(bool msg=true)
Definition: TaskWater.cs:138
override bool CanManualCancel()
Definition: TaskWater.cs:28
override bool CanPerform()
Definition: TaskWater.cs:19
List< Point > ListPoints()
Definition: TaskWater.cs:148
Point dest
Definition: TaskWater.cs:6
Definition: Task.cs:4
override Status Cancel()
Definition: Task.cs:54
Definition: Thing.cs:8
Card owner
Definition: Trait.cs:28