Elin Decompiled Documentation EA 23.200 Stable
Loading...
Searching...
No Matches
TaskHarvest.cs
Go to the documentation of this file.
1using UnityEngine;
2
4{
5 public bool wasReapSeed;
6
7 public bool wasCrime;
8
9 public bool harvestingCrop;
10
12
13 public bool IsObj => mode == HarvestType.Obj;
14
15 public bool IsReapSeed
16 {
17 get
18 {
19 if (IsObj && CanReapSeed && owner.Tool != null)
20 {
22 {
23 return owner.Tool.category.IsChildOf("scythe");
24 }
25 return true;
26 }
27 return false;
28 }
29 }
30
31 public override HarvestType harvestType => mode;
32
33 public override string IdRecipe
34 {
35 get
36 {
37 if (!IsObj)
38 {
39 if (target == null)
40 {
41 return "";
42 }
43 return target.source.RecipeID;
44 }
45 return pos.sourceObj.RecipeID;
46 }
47 }
48
49 public override int RightHand => 1005;
50
51 public override int destDist => 1;
52
53 public override bool IsGrowth => pos.growth != null;
54
55 public override bool IsHostileAct
56 {
57 get
58 {
59 if (!wasCrime)
60 {
61 if (mode == HarvestType.Disassemble)
62 {
63 Thing thing = target;
64 if (thing != null && thing.isNPCProperty)
65 {
66 goto IL_007b;
67 }
68 }
69 if (mode == HarvestType.Obj)
70 {
71 if (!pos.sourceObj.ContainsTag("crime"))
72 {
73 if (pos.growth != null && pos.growth.IsCrimeToHarvest)
74 {
75 return !(EClass._zone is Zone_Harvest);
76 }
77 return false;
78 }
79 return true;
80 }
81 return false;
82 }
83 goto IL_007b;
84 IL_007b:
85 return true;
86 }
87 }
88
89 public override bool Loop
90 {
91 get
92 {
94 {
95 return CanProgress();
96 }
97 return false;
98 }
99 }
100
101 public override bool CanManualCancel()
102 {
103 return true;
104 }
105
106 public override string GetBaseText(string str)
107 {
108 if (IsReapSeed)
109 {
110 return "TaskHarvestSeed".lang();
111 }
112 if (mode == HarvestType.Disassemble)
113 {
114 return (HaveHarvestThing() ? "TaskDisassemble" : "TaskDisassemble_destroy").lang();
115 }
116 if (!base.IsHarvest)
117 {
118 return base.GetBaseText(str);
119 }
120 return "actHarvest".lang();
121 }
122
123 public override string GetTextSmall(Card c)
124 {
125 if (IsObj)
126 {
127 return base.GetTextSmall(c);
128 }
129 if (target == null)
130 {
131 return "";
132 }
133 return target.Name;
134 }
135
136 public static TaskHarvest TryGetAct(Chara c, Point p)
137 {
138 Thing t = c.Tool;
139 bool hasTool = t != null && (t.HasElement(225) || t.HasElement(220));
140 bool hasDiggingTool = t != null && t.HasElement(230);
141 if (t != null)
142 {
143 if (t.trait is TraitToolBrush)
144 {
145 return null;
146 }
147 if (t.trait is TraitToolShears)
148 {
149 return null;
150 }
151 if (t.trait is TraitToolWaterCan)
152 {
153 return null;
154 }
155 if (t.trait is TraitToolMusic)
156 {
157 return null;
158 }
159 if (t.trait is TraitToolSickle && !p.cell.CanReapSeed())
160 {
161 return null;
162 }
163 if (t.trait is TraitAbility)
164 {
165 return null;
166 }
167 }
169 {
170 return null;
171 }
172 if (p.HasObj && IsValidTarget(p.sourceObj.reqHarvest))
173 {
174 return new TaskHarvest
175 {
176 pos = p.Copy()
177 };
178 }
179 if (p.HasThing)
180 {
181 for (int num = p.Things.Count - 1; num >= 0; num--)
182 {
183 t = p.Things[num];
184 if (t.trait.ReqHarvest != null && IsValidTarget(t.trait.ReqHarvest.Split(',')))
185 {
186 return new TaskHarvest
187 {
188 pos = p.Copy(),
189 mode = HarvestType.Thing,
190 target = t
191 };
192 }
193 }
194 for (int num2 = p.Things.Count - 1; num2 >= 0; num2--)
195 {
196 t = p.Things[num2];
198 {
199 return new TaskHarvest
200 {
201 pos = p.Copy(),
202 mode = HarvestType.Disassemble,
203 target = t
204 };
205 }
206 }
207 }
208 return null;
209 bool IsValidTarget(string[] raw)
210 {
211 if (raw[0] == "digging")
212 {
213 return hasDiggingTool;
214 }
215 bool num3 = p.cell.CanHarvest();
216 int num4 = (num3 ? 250 : EClass.sources.elements.alias[raw[0]].id);
217 bool flag = ((!num3 && num4 != 250) ? true : false);
218 if (!flag && t != null && !t.trait.CanHarvest)
219 {
220 return false;
221 }
222 return !flag || hasTool;
223 }
224 }
225
226 public override bool CanProgress()
227 {
228 if (tool != null && tool.trait is TraitToolSickle && !pos.cell.CanReapSeed())
229 {
230 return false;
231 }
232 if (IsObj)
233 {
235 if (base.CanProgress())
236 {
237 return pos.HasObj;
238 }
239 return false;
240 }
241 if (target == null || !target.ExistsOnMap)
242 {
243 return false;
244 }
245 return base.CanProgress();
246 }
247
248 public override HitResult GetHitResult()
249 {
250 if (harvestingCrop && !base.IsHarvest)
251 {
252 return HitResult.Default;
253 }
254 if (IsObj)
255 {
256 if (base.IsHarvest)
257 {
258 return HitResult.Valid;
259 }
260 if (pos.HasObj)
261 {
262 return HitResult.Valid;
263 }
265 {
266 return HitResult.Valid;
267 }
268 return HitResult.Default;
269 }
270 if (target == null || !target.ExistsOnMap)
271 {
272 return HitResult.Default;
273 }
274 return HitResult.Valid;
275 }
276
277 public override void OnCreateProgress(Progress_Custom p)
278 {
280 string i = (IsObj ? pos.cell.GetObjName() : target.Name);
281 SourceMaterial.Row mat = (IsObj ? pos.cell.matObj : target.material);
282 GrowSystem growth = pos.growth;
283 float num = (base.IsHarvest ? 0.5f : ((!IsObj) ? 1f : ((growth != null) ? growth.MtpProgress : 1f)));
284 int exp = 50;
287 p.textHint = i;
288 p.maxProgress = (int)((float)(maxProgress * 150) * num / 100f);
289 p.interval = 1;
290 p.onProgressBegin = delegate
291 {
292 if (TryGetAct(owner, pos) == null)
293 {
294 p.Cancel();
295 }
296 else if (base.IsTooHard)
297 {
298 owner.Say((mode == HarvestType.Disassemble) ? "tooHardToDisassemble" : "tooHardToHarvest", owner, i);
299 p.Cancel();
300 }
301 else if (mode == HarvestType.Disassemble)
302 {
303 owner.Say("disassemble_start", owner, owner.Tool, i);
304 }
305 else if (owner.Tool == null)
306 {
307 owner.Say("harvestHand_start", owner, i);
308 }
309 else
310 {
311 owner.Say("harvest_start", owner, owner.Tool, i);
312 }
313 };
314 p.onProgress = delegate(Progress_Custom _p)
315 {
318 if (_p.progress % 2 == 0)
319 {
320 if (IsObj)
321 {
322 if (base.IsHarvest && growth != null)
323 {
325 if (growth.AnimeProgress != 0)
326 {
327 pos.Animate(growth.AnimeProgress);
328 }
329 return;
330 }
331 pos.Animate(AnimeID.HitObj);
332 }
333 else
334 {
335 target.PlayAnime(AnimeID.HitObj);
336 }
338 mat.PlayHitEffect(pos);
339 mat.AddBlood(pos);
340 effectFrame += maxProgress / 4 + 1;
341 if (EClass._zone.IsCrime(owner, this))
342 {
344 }
345 }
346 };
347 p.onProgressComplete = delegate
348 {
349 string idRecipe = IdRecipe;
351 int num2 = ((EClass.rnd(3) != 0) ? 1 : 0);
352 if (IsObj)
353 {
354 SourceObj.Row sourceObj = pos.sourceObj;
355 bool flag = false;
356 if (difficulty >= 0 && EClass.rnd(6) == 0)
357 {
358 flag = true;
359 }
360 if (difficulty >= 2 && EClass.rnd(3) == 0)
361 {
362 flag = true;
363 }
364 if (flag && growth != null)
365 {
366 growth.OnHitFail(owner);
367 }
368 if (EClass._zone is Zone_Harvest && !base.IsHarvest && pos.IsFarmField)
369 {
371 pos.SetObj();
372 }
373 else
374 {
375 if (base.IsHarvest && !IsReapSeed)
376 {
377 if (pos.growth.CanHarvest())
378 {
379 harvestingCrop = true;
380 }
382 }
383 else if (growth != null && !IsReapSeed)
384 {
386 }
387 else
388 {
389 EClass._map.MineObj(pos, this);
390 }
391 if (sourceObj.alias == "mound")
392 {
393 if (EClass.rnd(7) == 0)
394 {
395 EClass._zone.AddThing("plat", pos);
396 }
397 else if (EClass.rnd(3) == 0)
398 {
400 }
401 else
402 {
403 EClass._zone.AddThing("bone", pos);
404 }
405 }
406 }
407 }
408 else
409 {
410 exp = target.Num * 5;
411 num2 = target.Num / 3 + EClass.rnd(target.Num / 3 + 2);
413 {
414 HarvestThing();
415 }
416 }
417 if (EClass._zone.IsCrime(owner, this) && EClass.rnd(3) != 0)
418 {
420 }
421 if (backerObj != null)
422 {
423 if (backerObj != null && !backerObj.loot.IsEmpty() && !EClass.player.doneBackers.Contains(backerObj.id))
424 {
425 if (EClass.sources.cards.map.ContainsKey(backerObj.loot))
426 {
427 Thing thing = ThingGen.Create(backerObj.loot);
428 switch (backerObj.id)
429 {
430 case 490:
431 case 867:
432 case 5160:
433 thing.c_charges = 0;
434 thing.c_priceFix = -100;
435 break;
436 case 2531:
437 thing.MakeFoodFrom("cloud_electric");
438 break;
439 case 1027:
440 thing.ChangeMaterial(25);
441 thing.SetBlessedState(BlessedState.Doomed);
442 thing.ChangeRarity(Rarity.Legendary);
443 break;
444 case 4565:
445 EClass._zone.AddThing("rod", pos);
446 EClass._zone.AddThing("money", pos).SetNum(121);
447 break;
448 case 5367:
449 thing.Dye("obsidian");
450 break;
451 case 471:
452 case 1828:
453 case 5765:
454 thing.SetBlessedState(BlessedState.Cursed);
455 break;
456 case 5529:
457 thing.ChangeMaterial(25);
458 break;
459 case 1854:
460 thing.decay = 10000;
461 break;
462 case 4788:
463 thing.SetEncLv(1);
464 break;
465 case 4615:
466 thing.ChangeMaterial("meat");
467 break;
468 }
469 EClass._zone.AddCard(thing, pos);
470 }
471 else
472 {
473 Debug.LogError("exception: Backer Loot not valid:" + backerObj.id + "/" + backerObj.loot);
474 }
475 Debug.Log(backerObj.id + "/" + backerObj.Name + "/" + backerObj.loot);
476 }
477 EClass.player.doneBackers.Add(backerObj.id);
478 if (!backerObj.Text.IsEmpty() && EClass.core.config.backer.Show(backerObj))
479 {
480 bool num3 = backerObj.type == 1;
481 Msg.Say(num3 ? "backerRemain_read" : "backerTree_read");
482 Msg.Say(num3 ? "backerRemain" : "backerTree", backerObj.Text);
483 }
484 }
485 if (owner.IsPC)
486 {
488 }
490 if (wasReapSeed)
491 {
492 owner.ModExp(286, 20);
493 }
494 owner.stamina.Mod(-num2);
495 if (owner != null && owner.IsPC)
496 {
498 }
499 };
500 }
501
502 public string GetIdDismantled()
503 {
504 if (target.HasElement(707))
505 {
506 return "fish_slice";
507 }
508 string[] array = target.source.components[0].Split('|');
509 for (int i = 0; i < array.Length; i++)
510 {
511 array[i] = array[i].Split('/')[0];
512 }
513 string result = array[0];
514 if (array.Length > 1)
515 {
516 string category = target.material.category;
517 bool flag = category == "rock" || category == "ore" || category == "gem";
518 if (array[0] == "ingot" && array[1] == "log" && !flag)
519 {
520 result = array[1];
521 }
522 }
524 {
525 result = target.material.thing;
526 }
527 return result;
528 }
529
530 public bool ShouldGenerateDismantled(string dest)
531 {
533 {
534 return false;
535 }
536 if (target.trait is TraitGrave)
537 {
538 return false;
539 }
541 {
542 return false;
543 }
544 if (dest.Contains("$") || dest.Contains("#") || dest.Contains("@") || dest.Contains("-"))
545 {
546 return false;
547 }
548 if (dest == target.id || !EClass.sources.cards.map.ContainsKey(dest))
549 {
550 return false;
551 }
552 if (target.source.components.IsEmpty())
553 {
554 return false;
555 }
556 return true;
557 }
558
559 public bool HaveHarvestThing()
560 {
561 string idDismantled = GetIdDismantled();
562 return ShouldGenerateDismantled(idDismantled);
563 }
564
565 public void HarvestThing()
566 {
567 string text = GetIdDismantled();
568 float num = target.Num;
569 float num2 = 1.0999999f;
570 if (target.trait.CraftNum > 1)
571 {
572 num2 = (float)target.trait.CraftNum * 1.35f;
573 }
574 switch (text)
575 {
576 case "log":
577 case "rock":
578 num2 = 2.1999998f;
579 break;
580 case "fish_slice":
581 num2 = 4.4f;
582 break;
583 }
584 string text2 = target.id;
585 if (text2 == "glass" || text2 == "brick")
586 {
587 num2 = 2.1999998f;
588 }
589 float num3 = num % num2;
590 num /= num2;
591 Debug.Log("num:" + num + " div:" + num3 + " chance:" + num2 + " check:" + (num2 - num3 + 1f));
592 if (num3 > 0f && EClass.rndf(num2 - num3 + 1f) < 1f)
593 {
594 num += 1f;
595 }
596 if (target.sockets != null)
597 {
599 }
600 int decay = target.decay;
601 int lV = target.LV;
602 target.Die(null, EClass.pc);
603 if ((int)num <= 0 || !ShouldGenerateDismantled(text))
604 {
605 return;
606 }
607 if (target.isCopy || target.HasElement(764))
608 {
609 text = "ash3";
610 }
612 {
613 fixedQuality = true
614 });
615 Thing thing = ThingGen.Create(text, 1, Mathf.Max(1, lV * 2 / 3));
616 if (thing == null)
617 {
618 return;
619 }
620 if (EClass._zone.IsUserZone && target.isNPCProperty && (thing.trait is TraitPotionLove || thing.HasTag(CTAG.rareResource)))
621 {
622 Msg.Say("spellbookCrumble", thing);
623 thing.Destroy();
624 return;
625 }
626 thing.SetNum((int)num);
628 thing.decay = decay;
629 if (thing.IsDecayed && thing.IsFood)
630 {
631 thing.elements.SetBase(73, -10);
632 }
634 }
635}
AnimeID
Definition: AnimeID.cs:2
BlessedState
Definition: BlessedState.cs:2
CTAG
Definition: CTAG.cs:2
HitResult
Definition: HitResult.cs:2
Rarity
Definition: Rarity.cs:2
virtual Status Cancel()
Definition: AIAct.cs:291
new Chara owner
Definition: AIAct.cs:14
int progress
Definition: AIProgress.cs:5
virtual bool CanReapSeed
void SetTarget(Chara c, Thing _tool=null)
static BuildMenu Instance
Definition: BuildMenu.cs:77
static void Set(CardBlueprint _bp)
virtual void NextFrame()
Definition: Card.cs:11
bool IsDecayed
Definition: Card.cs:2249
bool isMasked
Definition: Card.cs:576
ElementContainerCard elements
Definition: Card.cs:39
string id
Definition: Card.cs:33
bool isNPCProperty
Definition: Card.cs:540
virtual void Die(Element e=null, Card origin=null, AttackSource attackSource=AttackSource.None, Chara originalTarget=null)
Definition: Card.cs:4864
bool HasElement(int ele, int req=1)
Definition: Card.cs:5725
SourceMaterial.Row material
Definition: Card.cs:2013
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:5939
Card ChangeMaterial(int idNew, bool ignoreFixedMaterial=false)
Definition: Card.cs:2994
bool isCopy
Definition: Card.cs:864
Thing Tool
Definition: Card.cs:2372
bool IsEquipmentOrRangedOrAmmo
Definition: Card.cs:2192
void CalculateFOV()
Definition: Card.cs:6263
string Name
Definition: Card.cs:2099
bool ExistsOnMap
Definition: Card.cs:2047
void EjectSockets()
Definition: Card.cs:3474
Thing SetNum(int a)
Definition: Card.cs:3393
int decay
Definition: Card.cs:204
bool IsFood
Definition: Card.cs:2137
virtual void SetBlessedState(BlessedState s)
Definition: Card.cs:3793
bool HasTag(CTAG tag)
Definition: Card.cs:2557
Point pos
Definition: Card.cs:57
void Dye(string idMat)
Definition: Card.cs:5795
Trait trait
Definition: Card.cs:51
void SetEncLv(int a)
Definition: Card.cs:3762
Card MakeFoodFrom(string _id)
Definition: Card.cs:5353
void Destroy()
Definition: Card.cs:4931
bool isHidden
Definition: Card.cs:516
void ModExp(string alias, int a)
Definition: Card.cs:2610
int Num
Definition: Card.cs:156
void PlayAnime(AnimeID id, bool force=false)
Definition: Card.cs:5958
SourceCategory.Row category
Definition: Card.cs:2011
virtual void ChangeRarity(Rarity q)
Definition: Card.cs:3818
List< int > sockets
Definition: Card.cs:45
CardRenderer renderer
Definition: Card.cs:59
int LV
Definition: Card.cs:372
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:6586
bool CanHarvest()
Definition: Cell.cs:1664
string GetObjName()
Definition: Cell.cs:1604
bool CanReapSeed()
Definition: Cell.cs:1669
Definition: Chara.cs:10
override bool IsPC
Definition: Chara.cs:610
Stats stamina
Definition: Chara.cs:1128
override void LookAt(Card c)
Definition: Chara.cs:3474
BackerContentConfig backer
Definition: CoreConfig.cs:608
bool godBuild
Definition: CoreDebug.cs:304
CoreConfig config
Definition: Core.cs:70
Definition: EClass.cs:5
static Game game
Definition: EClass.cs:8
static Core core
Definition: EClass.cs:6
static Zone _zone
Definition: EClass.cs:20
static Map _map
Definition: EClass.cs:18
static int rnd(long a)
Definition: EClass.cs:58
static SourceManager sources
Definition: EClass.cs:42
static float rndf(float a)
Definition: EClass.cs:92
static Player player
Definition: EClass.cs:12
static Chara pc
Definition: EClass.cs:14
static CoreDebug debug
Definition: EClass.cs:48
void ModExp(int ele, float a, bool chain=false)
Element SetBase(string alias, int v, int potential=0)
bool disableUsermapBenefit
GamePrincipal principal
Definition: Game.cs:221
bool IsSurvival
Definition: Game.cs:272
bool CanHarvest()
Definition: GrowSystem.cs:501
virtual AnimeID AnimeProgress
Definition: GrowSystem.cs:99
virtual void OnHitFail(Chara c)
Definition: GrowSystem.cs:519
virtual bool IsCrimeToHarvest
Definition: GrowSystem.cs:89
void OnProgressComplete(Chara c)
Definition: GrowSystem.cs:523
virtual string GetSoundProgress()
Definition: GrowSystem.cs:125
void Harvest(Chara c)
Definition: GrowSystem.cs:618
void DestroyObj(Point point)
Definition: Map.cs:1825
void TrySmoothPick(Cell cell, Thing t, Chara c)
Definition: Map.cs:1804
void MineObj(Point point, Task task=null, Chara c=null)
Definition: Map.cs:1840
SourceBacker.Row GetBackerObj(Point p)
Definition: Map.cs:1592
Definition: Msg.cs:5
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
RecipeManager recipes
Definition: Player.cs:1053
void ModKarma(int a)
Definition: Player.cs:2444
HashSet< int > doneBackers
Definition: Player.cs:1029
HotItem currentHotItem
Definition: Player.cs:1056
Definition: Point.cs:9
bool HasDecal
Definition: Point.cs:139
void SetObj(int id=0, int value=1, int dir=0)
Definition: Point.cs:912
Point Copy()
Definition: Point.cs:479
bool IsBlocked
Definition: Point.cs:351
List< Thing > Things
Definition: Point.cs:326
bool IsFarmField
Definition: Point.cs:127
SoundSource PlaySound(string id, bool synced=true, float v=1f, bool spatial=true)
Definition: Point.cs:1237
bool HasThing
Definition: Point.cs:239
SourceObj.Row sourceObj
Definition: Point.cs:69
bool TryWitnessCrime(Chara criminal, Chara target=null, int radius=4, Func< Chara, bool > funcWitness=null)
Definition: Point.cs:861
bool HasObj
Definition: Point.cs:137
Cell cell
Definition: Point.cs:51
void Animate(AnimeID id, bool animeBlock=false)
Definition: Point.cs:1286
GrowSystem growth
Definition: Point.cs:77
void ComeUpWithRecipe(string idRecipe, int chanceForRandomRecipe=0)
Dictionary< string, CardRow > map
Definition: SourceCard.cs:8
SourceCard cards
SourceElement elements
string GetSoundImpact(RenderRow c=null)
void AddBlood(Point p, int a=1)
void PlayHitEffect(Point p, int emit=2)
virtual void Mod(int a)
Definition: Stats.cs:135
override bool CanProgress()
Definition: TaskHarvest.cs:226
bool HaveHarvestThing()
Definition: TaskHarvest.cs:559
override string GetTextSmall(Card c)
Definition: TaskHarvest.cs:123
string GetIdDismantled()
Definition: TaskHarvest.cs:502
bool wasReapSeed
Definition: TaskHarvest.cs:5
HarvestType mode
Definition: TaskHarvest.cs:11
bool IsReapSeed
Definition: TaskHarvest.cs:16
override bool IsHostileAct
Definition: TaskHarvest.cs:56
bool harvestingCrop
Definition: TaskHarvest.cs:9
void HarvestThing()
Definition: TaskHarvest.cs:565
bool wasCrime
Definition: TaskHarvest.cs:7
override int destDist
Definition: TaskHarvest.cs:51
static TaskHarvest TryGetAct(Chara c, Point p)
Definition: TaskHarvest.cs:136
override bool IsGrowth
Definition: TaskHarvest.cs:53
override HitResult GetHitResult()
Definition: TaskHarvest.cs:248
override HarvestType harvestType
Definition: TaskHarvest.cs:31
override int RightHand
Definition: TaskHarvest.cs:49
override bool Loop
Definition: TaskHarvest.cs:90
bool ShouldGenerateDismantled(string dest)
Definition: TaskHarvest.cs:530
override string GetBaseText(string str)
Definition: TaskHarvest.cs:106
override void OnCreateProgress(Progress_Custom p)
Definition: TaskHarvest.cs:277
override string IdRecipe
Definition: TaskHarvest.cs:34
override bool CanManualCancel()
Definition: TaskHarvest.cs:101
Point pos
Definition: TaskPoint.cs:11
static Thing CreateFromCategory(string idCat, int lv=-1)
Definition: ThingGen.cs:75
static Thing Create(string id, int idMat=-1, int lv=-1)
Definition: ThingGen.cs:53
Definition: Thing.cs:8
SourceThing.Row source
Definition: Thing.cs:11
string alias
Definition: TileRow.cs:12
virtual bool CanHarvest
Definition: Trait.cs:91
virtual bool CanBeDisassembled
Definition: Trait.cs:305
virtual string ReqHarvest
Definition: Trait.cs:302
virtual int CraftNum
Definition: Trait.cs:132
Card AddThing(string id, int x, int z)
Definition: Zone.cs:1933
virtual bool IsUserZone
Definition: Zone.cs:266
bool IsCrime(Chara c, Act act)
Definition: Zone.cs:3420
Card AddCard(Card t, Point point)
Definition: Zone.cs:1943