20 public bool IsReapSeed
24 return this.IsObj && this.CanReapSeed && this.owner.Tool !=
null && (this.owner.Tool.trait is
TraitToolSickle || this.owner.Tool.category.IsChildOf(
"scythe"));
30 public override BaseTaskHarvest.HarvestType harvestType
40 public override int RightHand
50 public override int destDist
60 public override bool IsGrowth
64 return this.pos.growth !=
null;
70 public override bool IsHostileAct
78 Thing target = this.target;
79 if (target !=
null && target.isNPCProperty)
84 return this.mode == BaseTaskHarvest.HarvestType.Obj && (this.pos.sourceObj.ContainsTag(
"crime") || (this.pos.growth !=
null &&
this.pos.growth.IsCrimeToHarvest && !(
EClass._zone is
Zone_Harvest)));
91 public override bool CanManualCancel()
97 public override string GetBaseText(
string str)
101 return "TaskHarvestSeed".lang();
105 return (this.HaveHarvestThing() ?
"TaskDisassemble" :
"TaskDisassemble_destroy").lang();
109 return base.GetBaseText(str);
111 return "actHarvest".lang();
115 public override string GetTextSmall(
Card c)
119 return base.GetTextSmall(c);
121 if (this.target ==
null)
125 return this.target.Name;
132 CS$<>8__locals1.p = p;
133 CS$<>8__locals1.t = c.Tool;
134 CS$<>8__locals1.hasTool = (CS$<>8__locals1.t !=
null && (CS$<>8__locals1.t.HasElement(225, 1) || CS$<>8__locals1.t.HasElement(220, 1)));
135 CS$<>8__locals1.hasDiggingTool = (CS$<>8__locals1.t !=
null && CS$<>8__locals1.t.HasElement(230, 1));
136 if (CS$<>8__locals1.t !=
null)
146 if (CS$<>8__locals1.t.trait is
TraitToolSickle && !CS$<>8__locals1.p.cell.CanReapSeed())
151 if (CS$<>8__locals1.p.HasObj &&
TaskHarvest.<TryGetAct>g__IsValidTarget|20_0(CS$<>8__locals1.p.sourceObj.reqHarvest, ref CS$<>8__locals1))
155 pos = CS$<>8__locals1.p.Copy()
158 if (CS$<>8__locals1.p.HasThing)
160 for (
int i = CS$<>8__locals1.p.Things.Count - 1; i >= 0; i--)
162 CS$<>8__locals1.t = CS$<>8__locals1.p.Things[i];
163 if (CS$<>8__locals1.t.trait.ReqHarvest !=
null &&
TaskHarvest.<TryGetAct>g__IsValidTarget|20_0(CS$<>8__locals1.t.trait.ReqHarvest.Split(
',', StringSplitOptions.None), ref CS$<>8__locals1))
167 pos = CS$<>8__locals1.p.Copy(),
169 target = CS$<>8__locals1.t
173 for (
int j = CS$<>8__locals1.p.Things.Count - 1; j >= 0; j--)
175 CS$<>8__locals1.t = CS$<>8__locals1.p.Things[j];
176 if (!CS$<>8__locals1.t.isHidden && !CS$<>8__locals1.t.isMasked && CS$<>8__locals1.t.trait.CanBeDisassembled)
183 pos = CS$<>8__locals1.p.Copy(),
185 target = CS$<>8__locals1.t
195 public override bool CanProgress()
199 base.SetTarget(this.owner ??
EClass.pc,
null);
200 return base.CanProgress() && this.pos.HasObj;
202 return this.target !=
null && this.target.ExistsOnMap && base.CanProgress();
206 public override HitResult GetHitResult()
212 return HitResult.Valid;
216 return HitResult.Valid;
220 return HitResult.Valid;
222 return HitResult.Default;
226 if (this.target ==
null || !this.target.ExistsOnMap)
228 return HitResult.Default;
230 return HitResult.Valid;
237 base.SetTarget(this.owner,
null);
238 string n = this.IsObj ? this.pos.cell.GetObjName() : this.target.Name;
241 float num = base.IsHarvest ? 0.5f : ((!this.IsObj) ? 1f : ((growth !=
null) ? growth.MtpProgress : 1f));
243 this.wasReapSeed = this.IsReapSeed;
244 this.wasCrime = this.IsHostileAct;
246 p.maxProgress = (int)((
float)(this.maxProgress * 150) * num / 100f);
248 p.onProgressBegin = delegate()
252 this.owner.Say((this.mode ==
BaseTaskHarvest.HarvestType.Disassemble) ?
"tooHardToDisassemble" :
"tooHardToHarvest",
this.owner, n,
null);
258 this.owner.Say(
"disassemble_start", this.owner, this.owner.Tool, n,
null);
261 if (this.owner.Tool ==
null)
263 this.owner.Say(
"harvestHand_start", this.owner, n,
null);
266 this.owner.Say(
"harvest_start", this.owner, this.owner.Tool, n,
null);
270 this.owner.LookAt(this.pos);
271 this.owner.renderer.NextFrame();
272 if (_p.progress % 2 == 0)
276 if (this.IsHarvest && growth !=
null)
278 this.owner.PlaySound(growth.GetSoundProgress(), 1f,
true);
279 if (growth.AnimeProgress != AnimeID.None)
281 this.pos.Animate(growth.AnimeProgress,
false);
285 this.pos.Animate(AnimeID.HitObj,
false);
289 this.target.PlayAnime(AnimeID.HitObj,
false);
291 this.pos.PlaySound(mat.GetSoundImpact(
null),
true, 1f,
true);
292 mat.PlayHitEffect(this.pos);
293 mat.AddBlood(this.pos, 1);
294 this.effectFrame += this.maxProgress / 4 + 1;
295 if (
EClass._zone.IsCrime(
this.owner,
this))
297 this.owner.pos.TryWitnessCrime(this.owner,
null, 4,
null);
301 p.onProgressComplete = delegate()
303 string idRecipe = this.IsObj ? this.pos.sourceObj.RecipeID : ((this.target !=
null) ? this.target.source.RecipeID :
"");
305 int num2 = (
EClass.rnd(3) == 0) ? 0 : 1;
310 if (this.difficulty >= 0 &&
EClass.rnd(6) == 0)
314 if (this.difficulty >= 2 &&
EClass.rnd(3) == 0)
318 if (flag && growth !=
null)
320 growth.OnHitFail(this.owner);
324 EClass._map.DestroyObj(this.pos);
325 this.pos.SetObj(0, 1, 0);
329 if (this.IsHarvest && !this.IsReapSeed)
331 this.pos.growth.Harvest(this.owner);
333 else if (growth !=
null && !this.IsReapSeed)
335 growth.OnProgressComplete(this.owner);
339 EClass._map.MineObj(this.pos,
this,
null);
341 if (sourceObj.alias ==
"mound")
345 EClass._zone.AddThing(
"plat", this.pos);
347 else if (
EClass.rnd(3) == 0)
349 EClass._zone.AddCard(
ThingGen.CreateFromCategory(
"junk", -1),
this.pos);
353 EClass._zone.AddThing(
"bone", this.pos);
360 exp = this.target.Num * 5;
361 num2 = this.target.Num / 3 +
EClass.rnd(this.target.Num / 3 + 2);
364 if (
EClass._zone.IsCrime(
this.owner,
this) &&
EClass.rnd(3) != 0)
366 EClass.player.ModKarma(-1);
368 if (backerObj !=
null)
370 if (backerObj !=
null && !backerObj.loot.IsEmpty() && !
EClass.player.doneBackers.Contains(backerObj.id))
372 if (
EClass.sources.cards.map.ContainsKey(backerObj.loot))
375 int id = backerObj.id;
384 if (
id != 490 &&
id != 867)
393 thing.ChangeMaterial(25);
394 thing.SetBlessedState(BlessedState.Doomed);
395 thing.ChangeRarity(Rarity.Legendary);
415 thing.MakeFoodFrom(
"putty");
423 EClass._zone.AddThing(
"rod", this.pos);
424 EClass._zone.AddThing(
"money", this.pos).SetNum(121);
429 thing.ChangeMaterial(
"meat");
447 thing.Dye(
"obsidian");
455 thing.ChangeMaterial(25);
465 thing.c_priceFix = -100;
468 thing.SetBlessedState(BlessedState.Cursed);
470 EClass._zone.AddCard(thing, this.pos);
474 Debug.LogError(
"exception: Backer Loot not valid:" + backerObj.id.ToString() +
"/" + backerObj.loot);
476 Debug.Log(
string.Concat(
new string[]
478 backerObj.id.ToString(),
485 EClass.player.doneBackers.Add(backerObj.id);
486 if (!backerObj.Text.IsEmpty() &&
EClass.core.config.backer.Show(backerObj))
488 bool flag2 = backerObj.type == 1;
489 Msg.Say(flag2 ?
"backerRemain_read" :
"backerTree_read");
490 Msg.Say(flag2 ?
"backerRemain" :
"backerTree", backerObj.Text,
null,
null,
null);
497 this.owner.elements.ModExp(this.idEle, exp,
false);
498 if (this.wasReapSeed)
500 this.owner.ModExp(286, 20);
502 this.owner.stamina.Mod(-num2);
503 if (this.owner ==
null)
509 EClass.player.recipes.ComeUpWithRecipe(idRecipe, 30);
515 public bool HaveHarvestThing()
517 string text = this.target.source.components[0].Split(
'|', StringSplitOptions.None)[0].Split(
'/', StringSplitOptions.None)[0];
518 if (this.target.IsEquipmentOrRanged ||
this.target.IsAmmo)
520 text = this.target.material.thing;
522 return !(this.target.trait is
TraitGrave) && !text.Contains(
"$") && !text.Contains(
"#") && !text.Contains(
"@") && !text.Contains(
"-") && !(text == this.target.id) &&
EClass.sources.cards.map.ContainsKey(text) && !this.target.source.components.IsEmpty();
526 public void HarvestThing()
528 string text = this.target.source.components[0].Split(
'|', StringSplitOptions.None)[0].Split(
'/', StringSplitOptions.None)[0];
529 if (this.target.IsEquipmentOrRanged ||
this.target.IsAmmo)
531 text = this.target.material.thing;
533 float num = (float)this.target.Num;
535 if (text ==
"log" || text ==
"rock")
543 float num3 = num % num2;
545 if (num3 > 0f &&
EClass.rndf(num2 - num3 + 1f) < 1f)
549 if (this.target.sockets !=
null)
551 this.target.EjectSockets();
553 int decay = this.target.decay;
554 int lv = this.target.LV;
555 this.target.Die(
null,
null, AttackSource.None);
560 if (text.Contains(
"$") || text.Contains(
"#") || text.Contains(
"@") || text.Contains(
"-"))
564 if (text == this.target.id || !
EClass.sources.cards.map.ContainsKey(text))
568 if ((
int)num <= 0 || this.target.source.components.IsEmpty())
572 if (this.target.isCopy)
580 Thing thing =
ThingGen.Create(text, 1, Mathf.Max(1, lv * 2 / 3));
583 thing.SetNum((
int)num);
584 thing.ChangeMaterial(this.target.material);
586 if (thing.IsDecayed && thing.IsFood)
588 thing.elements.SetBase(73, -10, 0);
590 EClass._map.TrySmoothPick(this.pos.IsBlocked ?
this.owner.pos :
this.pos, thing,
EClass.pc);
596 internal static bool <TryGetAct>g__IsValidTarget|20_0(
string[] raw, ref
TaskHarvest.<>c__DisplayClass20_0 A_1)
598 if (raw[0] ==
"digging")
600 return A_1.hasDiggingTool;
602 bool flag = A_1.p.cell.CanHarvest();
603 int num = flag ? 250 :
EClass.sources.elements.alias[raw[0]].id;
604 bool flag2 = !flag && num != 250;
605 return (flag2 || A_1.t ==
null || A_1.t.trait.CanHarvest) && (!flag2 | A_1.hasTool);
609 public bool wasReapSeed;
612 public bool wasCrime;
615 public BaseTaskHarvest.HarvestType mode =
BaseTaskHarvest.HarvestType.Obj;