Elin Decompiled Documentation EA 23.335 Nightly
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 if (ShouldWater(p))
102 {
103 owner.ModExp(286, 15);
104 }
105 p.cell.isWatered = true;
106 if (!p.cell.blocked && EClass.rnd(5) == 0)
107 {
108 EClass._map.SetLiquid(p.x, p.z, 1);
109 }
110 if (p.cell.HasFire)
111 {
112 p.ModFire(-50, extinguish: true);
113 }
114 }
115 }
116
117 public static bool ShouldWater(Point p)
118 {
119 Cell cell = p.cell;
120 if (cell.HasFire)
121 {
122 return true;
123 }
124 if (cell.isWatered || cell.IsTopWater || cell.IsSnowTile || !p.IsFarmField)
125 {
126 return false;
127 }
128 if (p.cell.detail != null)
129 {
130 foreach (Thing thing in p.Things)
131 {
132 if (thing.trait is TraitSeed)
133 {
134 return true;
135 }
136 }
137 }
138 return p.growth != null;
139 }
140
141 public bool IsWaterCanValid(bool msg = true)
142 {
143 bool num = waterCan != null && waterCan.owner.c_charges > 0;
144 if (!num && msg)
145 {
146 Msg.Say("water_deplete");
147 }
148 return num;
149 }
150
151 public List<Point> ListPoints()
152 {
153 List<Point> list = new List<Point>();
155 {
156 if (ShouldWater(p))
157 {
158 list.Add(p.Copy());
159 }
160 });
161 return list;
162 }
163}
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:6633
Trait trait
Definition: Card.cs:54
void ModCharge(int a, bool destroy=false)
Definition: Card.cs:4128
int Evalue(int ele)
Definition: Card.cs:2704
int Dist(Card c)
Definition: Card.cs:8192
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:7311
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:1523
List< Point > ListPointsInSquare(Point center, int radius, bool mustBeWalkable=true, bool los=true)
Definition: Map.cs:2337
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:117
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:141
override bool CanManualCancel()
Definition: TaskWater.cs:28
override bool CanPerform()
Definition: TaskWater.cs:19
List< Point > ListPoints()
Definition: TaskWater.cs:151
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