11 public override int destDist
20 public override bool CanManualCancel()
27 public override bool CanPressRepeat
31 return this.useHeld && EClass.pc.held !=
null &&
EClass.pc.held.trait.CanExtendBuild;
37 public override bool HasProgress
47 public override bool destIgnoreConnection
51 return this.recipe.IsFloorOrBridge;
61 return this.held !=
null;
87 public override bool isBlock
91 return this.recipe.IsBlock;
96 public override string GetText(
string str =
"")
98 if (this.useHeld &&
EClass.pc.held !=
null)
100 if (
EClass.pc.held.category.id ==
"seed")
102 return "actInstallSeed".lang();
104 if (
EClass.pc.held.id ==
"fertilizer")
106 return "actInstallFertilizer".lang();
109 return base.GetText(str);
113 public override bool _CanPerformTask(
Chara chara,
int radius)
116 if (!ingredient.IsThingSpecified && ingredient.thing ==
null)
118 ingredient.thing =
EClass._map.Stocked.Find(ingredient.id, ingredient.mat, ingredient.refVal,
false);
119 if (ingredient.thing ==
null)
129 public override void OnAdd()
131 if (this.reqs ==
null)
133 this.reqs =
new int[this.recipe.ingredients.Count];
134 for (
int i = 0; i < this.recipe.ingredients.Count; i++)
136 this.reqs[i] = this.recipe.ingredients[i].req;
142 public override HitResult GetHitResult()
144 if (!this.pos.IsValid || (!
this.pos.IsInBoundsPlus && !
EClass.debug.ignoreBuildRule))
146 return HitResult.Invalid;
148 if (this.recipe ==
null)
150 Debug.Log(
"recipe is null");
151 return HitResult.Invalid;
157 return HitResult.Invalid;
159 if (
EClass.pc.held.TileType.IsBlockPass &&
this.pos.HasChara)
161 return HitResult.Invalid;
163 if (this.pos.HasBlock &&
EClass.pc.held.TileType.IsDoor &&
this.pos.HasWallOrFence &&
this.pos.cell.blockDir != 2)
165 this.recipe.SetDir((this.pos.cell.blockDir == 0) ? 0 : 1);
167 if (!
EClass.debug.ignoreBuildRule && !
EClass._zone.IsPCFaction)
171 return HitResult.Invalid;
173 if (
EClass._zone.RestrictBuild && !
EClass.pc.held.trait.CanBuildInTown)
175 return HitResult.Invalid;
179 if (this.lastPos !=
null)
181 if (this.recipe.IsBlock &&
this.lastPos.x !=
this.pos.x &&
this.lastPos.z !=
this.pos.z)
183 return HitResult.Invalid;
185 if (this.recipe.IsWallOrFence && ((
this.recipe._dir == 0 &&
this.pos.z !=
this.lastPos.z) || (
this.recipe._dir == 1 &&
this.pos.x !=
this.lastPos.x)))
187 return HitResult.Invalid;
190 if (!
false && this.recipe.HasSameTile(
this.pos,
this.recipe._dir,
this.altitude,
this.bridgeHeight))
192 return HitResult.Default;
194 if (this.recipe.IsThing)
197 if (cardRow !=
null && !base.CanPlaceCard(
this.pos, cardRow.model))
199 return HitResult.Invalid;
201 if (this.recipe.MultiSize &&
this.useHeld)
204 for (
int i = 0; i < this.H; i++)
206 for (
int j = 0; j < this.W; j++)
208 point.Set(this.pos.x - j,
this.pos.z + i);
211 return HitResult.Invalid;
213 HitResult hitResult = this._GetHitResult(point);
214 if (hitResult != HitResult.Valid && hitResult != HitResult.Warning)
216 return HitResult.Invalid;
220 return HitResult.Valid;
223 if (this.recipe.IsWallOrFence &&
this.pos.HasWallOrFence &&
AM_Adv.actCount == 0 &&
this.recipe._dir !=
this.pos.cell.blockDir)
225 return HitResult.Valid;
227 if (!this.useHeld &&
EClass.debug.ignoreBuildRule)
229 return HitResult.Valid;
231 if (
EClass.scene.actionMode.IsRoofEditMode(
null))
233 return HitResult.Valid;
235 return this._GetHitResult(this.pos);
239 public HitResult _GetHitResult(
Point p)
243 if (
EClass.pc.held ==
null ||
EClass.pc.held.isDestroyed)
245 return HitResult.Invalid;
247 if (p.Installed !=
null)
251 return HitResult.Invalid;
255 return HitResult.Invalid;
259 using (List<Thing>.Enumerator enumerator = p.Things.GetEnumerator())
261 while (enumerator.MoveNext())
263 if (enumerator.Current.trait is
TraitSeed)
265 return HitResult.Invalid;
272 return this.recipe.tileType._HitTest(p, this.recipe.Mold,
true);
276 public override void OnProgressComplete()
280 if (
EClass.pc.held ==
null ||
EClass.pc.held.GetRootCard() !=
EClass.pc ||
this.pos.Distance(
EClass.pc.pos) > 1 || !
this.pos.IsInBounds)
284 ActionMode.Build.FixBridge(this.pos, this.recipe);
285 this.bridgeHeight =
ActionMode.Build.bridgeHeight;
286 this.target = (EClass.pc.held.category.installOne ?
EClass.pc.held.Split(1) :
EClass.pc.held);
289 this.target.ModNum(-1,
true);
291 this.dir = this.recipe._dir;
292 EClass.pc.LookAt(this.pos);
293 EClass.pc.renderer.PlayAnime(AnimeID.Attack_Place,
this.pos);
294 if (this.target.id ==
"statue_weird")
296 EClass.pc.Say(
"statue_install",
null,
null);
299 this.lastPos = this.pos.Copy();
302 if (this.recipe.IsBridge)
304 this.dir = this.pos.cell.floorDir;
305 this.bridgeHeight = (int)this.pos.cell.bridgeHeight;
308 else if (this.recipe.IsFloor)
310 this.dir = this.pos.cell.floorDir;
312 else if (this.recipe.IsBlock)
314 this.dir = this.pos.cell.blockDir;
319 Effect.Get(
"smoke").Play(this.pos, 0f,
null,
null);
320 Effect.Get(
"mine").Play(this.pos, 0f,
null,
null).SetParticleColor(this.recipe.GetColorMaterial().GetColor()).Emit(10 +
EClass.rnd(10));
321 if (this.recipe.IsWallOrFence)
323 if (this.pos.HasWallOrFence &&
this.pos.cell.blockDir != 2 &&
this.pos.cell.blockDir !=
this.recipe._dir)
325 this.pos.cell.blockDir = 2;
326 EClass.pc.PlaySound(this.pos.matBlock.GetSoundImpact(
null), 1f,
true);
327 this.pos.RefreshTile();
330 if (this.pos.sourceRoofBlock.tileType.IsWallOrFence &&
this.pos.cell._roofBlockDir % 4 != 2 && (
int)(
this.pos.cell._roofBlockDir % 4) !=
this.recipe._dir)
332 this.pos.cell._roofBlockDir = this.pos.cell._roofBlockDir / 4 * 4 + 2;
333 EClass.pc.PlaySound(this.pos.matBlock.GetSoundImpact(
null), 1f,
true);
334 this.pos.RefreshTile();
339 if (this.bridgeHeight > 150)
341 this.bridgeHeight = 150;
343 this.recipe.Build(
this);
344 this.resources.Clear();
345 EClass.player.flags.OnBuild(this.recipe);
346 EClass._map.RefreshShadow(this.pos.x,
this.pos.z);
347 EClass._map.RefreshShadow(this.pos.x,
this.pos.z - 1);
348 EClass._map.RefreshFOV(this.pos.x,
this.pos.z, 6,
false);
349 EClass.pc.renderer.SetFirst(
true);
350 if (this.recipe.IsFloor)
354 bool isDownstairs = (card.trait as
TraitNewZone).IsDownstairs;
360 public override void OnDestroy()
362 foreach (
Thing t
in this.resources)
364 EClass._zone.AddCard(t, this.pos);
369 public override void DrawMarker(
int x,
int z,
RenderParam p)
371 this.recipe.OnRenderMarker(
Point.shared.Set(x, z),
this.owner !=
null, HitResult.Default, x ==
this.pos.x && z ==
this.pos.z,
this.dir,
this.bridgeHeight +
this.altitude);
384 public int bridgeHeight;
392 public List<Thing> resources =
new List<Thing>();
414 public Point lastPos;