10 public virtual bool IsRunning
14 return this.status == AIAct.Status.Running && this.owner !=
null;
20 public bool IsChildRunning
24 return this.child !=
null && this.child.status == AIAct.Status.Running && this.child.owner !=
null;
34 if (!this.IsChildRunning)
38 return this.child.IsMoveAI;
44 public virtual int MaxRestart
54 public new virtual string Name
58 return base.source.GetName();
63 public override string ToString()
65 return base.GetType().Name;
80 public virtual Sprite actionIcon
84 return EClass.core.refs.orbitIcons.Default;
90 public virtual bool IsNoGoal
100 public virtual bool IsAutoTurn
110 public virtual bool IsIdle
120 public virtual bool PushChara
130 public virtual int MaxProgress
140 public virtual bool ShowProgress
150 public virtual bool UseTurbo
160 public virtual int CurrentProgress
170 public virtual bool ShowCursor
180 public virtual bool CancelWhenDamaged
190 public virtual bool CancelWhenMoved
200 public virtual bool InformCancel
210 public virtual Thing RenderThing
224 if (!this.IsChildRunning)
228 return this.child.Current;
235 return (this.child ??
this).stateIcon;
240 public override bool IsAct
250 public override bool ShowPotential
260 public override bool UsePotential
270 public override bool ShowRelativeAttribute
279 public virtual Point GetDestination()
281 if (!this.IsChildRunning)
283 return this.owner.pos;
285 return this.child.GetDestination();
291 if (this.IsChildRunning)
293 return this.child.GetProgress();
299 public string GetCurrentActionText()
301 if (this.IsChildRunning && this.child.source.id != 0 && !
this.child.source.name_JP.IsEmpty())
303 return this.child.GetCurrentActionText();
305 return base.source.GetName().IsEmpty(
"idle".lang());
309 public override bool IsToolValid()
311 return this.owner == EClass.pc && Act.TOOL !=
null && Act.TOOL.parent ==
EClass.pc;
315 public virtual void OnStart()
320 public void SetOwner(
Chara c)
323 this.status =
AIAct.Status.Running;
328 public virtual void OnSetOwner()
333 public void SetChild(
AIAct seq, Func<AIAct.Status> _onChildFail =
null)
335 if (this.child !=
null)
340 this.child.parent =
this;
341 this.child.SetOwner(this.owner);
342 this.onChildFail = (_onChildFail ??
new Func<
AIAct.Status>(this.Cancel));
348 this.Enumerator = this.Run().GetEnumerator();
350 if (this.owner ==
null)
354 if (this.owner.held !=
null)
356 if (this.DropHeldOnStart)
358 this.owner.DropHeld(
null);
360 else if (this.PickHeldOnStart)
362 this.owner.PickHeld(
false);
365 if (this.RightHand != 0)
367 this.owner.SetTempHand(this.RightHand, this.LeftHand);
369 if (this.owner.IsPC &&
this.UseTurbo)
376 public override bool Perform()
378 Act.CC.SetAIImmediate(
this);
383 public AIAct.Status Restart()
385 this.restartCount += 1;
386 if ((
int)this.restartCount >= this.MaxRestart)
388 return this.Success(
null);
390 byte b = this.restartCount;
391 Chara chara = this.owner;
393 this.SetOwner(chara);
394 this.restartCount = b;
395 return this.status =
AIAct.Status.Running;
399 public AIAct.Status Success(Action action =
null)
401 this.status =
AIAct.Status.Success;
407 this.OnCancelOrSuccess();
413 public virtual void OnSuccess()
418 public bool TryCancel(
Card c)
420 if (!this.IsRunning || this.Enumerator ==
null)
424 if (this.InformCancel)
428 this.owner.Say(
"cancel_act_pc", this.owner,
null,
null);
432 this.owner.Say(
"cancel_act", this.owner, c,
null,
null);
436 this.owner.Say(
"cancel_act2", this.owner,
null,
null);
444 public virtual AIAct.Status Cancel()
446 this.status =
AIAct.Status.Fail;
447 if (this.owner !=
null && this.owner.held !=
null && !
this.owner.IsPC)
449 this.owner.PickHeld(
false);
452 this.OnCancelOrSuccess();
458 public virtual void OnCancel()
463 public virtual void OnCancelOrSuccess()
468 public virtual bool CanManualCancel()
470 return this.IsChildRunning && this.child is
AI_Goto;
474 public AIAct.Status KeepRunning()
476 return AIAct.Status.Running;
482 if (this.owner ==
null)
486 if (this.child !=
null)
491 if (this.Enumerator !=
null)
493 this.Enumerator.Dispose();
494 this.Enumerator =
null;
498 this.restartCount = 0;
499 this.onChildFail =
null;
504 public virtual void OnReset()
509 public AIAct.Status Tick()
511 if (this.owner ==
null || (this.isFail !=
null && this.isFail()))
513 return this.Cancel();
515 if (this.IsChildRunning)
517 switch (this.child.Tick())
519 case AIAct.Status.Running:
520 return AIAct.Status.Running;
521 case AIAct.Status.Fail:
522 if (this.onChildFail !=
null)
524 return this.onChildFail();
526 return AIAct.Status.Fail;
527 case AIAct.Status.Success:
528 if (this.owner ==
null || (this.isFail !=
null && this.isFail()))
530 return this.Cancel();
535 if (this.Enumerator ==
null)
538 if (this.status !=
AIAct.Status.Running)
543 if (!this.Enumerator.MoveNext())
545 return this.Success(
null);
551 public virtual IEnumerable<
AIAct.Status> Run()
553 yield
return this.Success(
null);
558 public AIAct.Status TickChild()
560 if (this.child ==
null || this.onChildFail ==
null)
562 AIAct aiact = this.child;
563 string str = (aiact !=
null) ? aiact.ToString() :
null;
565 Func<
AIAct.Status> func = this.onChildFail;
566 Debug.Log(str + str2 + ((func !=
null) ? func.ToString() :
null));
567 return AIAct.Status.Fail;
569 if (this.child.Tick() !=
AIAct.Status.Fail)
571 return AIAct.Status.Running;
573 if (this.onChildFail !=
null)
575 return this.onChildFail();
577 return AIAct.Status.Fail;
581 public AIAct.Status Do(
AIAct _seq, Func<AIAct.Status> _onChildFail =
null)
583 this.SetChild(_seq, _onChildFail);
584 return this.TickChild();
588 public AIAct.Status DoGotoInteraction(
Point pos, Func<AIAct.Status> _onChildFail =
null)
590 if (pos !=
null && pos.IsValid)
592 this.SetChild(
new AI_Goto(pos, 0,
false,
true), _onChildFail);
593 return this.TickChild();
595 if (_onChildFail ==
null)
597 return this.Cancel();
599 return _onChildFail();
603 public AIAct.Status DoGoto(
Point pos,
int dist = 0,
bool ignoreConnection =
false, Func<AIAct.Status> _onChildFail =
null)
605 if (pos !=
null && pos.IsValid)
607 this.SetChild(
new AI_Goto(pos, dist, ignoreConnection,
false), _onChildFail);
608 return this.TickChild();
610 if (_onChildFail ==
null)
612 return this.Cancel();
614 return _onChildFail();
618 public AIAct.Status DoGoto(
Card card, Func<AIAct.Status> _onChildFail =
null)
620 return this.DoGoto(card, (card.isChara || card.pos.cell.blocked) ? 1 : 0, _onChildFail);
624 public AIAct.Status DoGoto(
Card card,
int dist, Func<AIAct.Status> _onChildFail =
null)
626 if (card !=
null && card == this.owner.held)
628 return AIAct.Status.Running;
630 if (card !=
null && card.ExistsOnMap)
632 this.SetChild(
new AI_Goto(card, dist,
false,
false), _onChildFail);
633 return this.TickChild();
635 if (_onChildFail ==
null)
637 return this.Cancel();
639 return _onChildFail();
643 public AIAct.Status DoGotoSpot(
Card card, Func<AIAct.Status> _onChildFail =
null)
645 if (card !=
null && card == this.owner.held)
647 return AIAct.Status.Running;
649 if (card !=
null && card.ExistsOnMap)
651 Point randomPoint = card.trait.GetRandomPoint(
null);
652 int dist = randomPoint.cell.blocked ? 1 : 0;
653 this.SetChild(
new AI_Goto(randomPoint, dist,
false,
false), _onChildFail);
654 return this.TickChild();
656 if (_onChildFail ==
null)
658 return this.Cancel();
660 return _onChildFail();
664 public AIAct.Status DoGoto<T>(Func<AIAct.Status> _onChildFail =
null) where T :
Trait
666 Trait random =
EClass._map.Installed.traits.GetTraitSet<T>().GetRandom();
667 return this.DoGoto((random !=
null) ? random.owner :
null, _onChildFail);
671 public AIAct.Status DoGotoSpot<T>(Func<AIAct.Status> _onChildFail =
null) where T :
Trait
673 Trait random =
EClass._map.Installed.traits.GetTraitSet<T>().GetRandom();
676 this.DoGoto(random.GetRandomPoint(
null), 0,
false, _onChildFail);
678 if (_onChildFail ==
null)
680 return AIAct.Status.Fail;
682 return _onChildFail();
686 public AIAct.Status DoGrab(
Card card,
int num = -1,
bool pickHeld =
false, Func<AIAct.Status> _onChildFail =
null)
688 if (card !=
null && card == this.owner.held)
690 return AIAct.Status.Running;
692 if (card ==
null || !card.GetRootCard().ExistsOnMap)
694 return this.Cancel();
702 return this.TickChild();
706 public AIAct.Status DoGrab<T>() where T :
Trait
709 return this.TickChild();
713 public AIAct.Status DoProgress()
715 this.SetChild(this.CreateProgress(),
null);
716 return this.TickChild();
720 public AIAct.Status DoIdle(
int repeat = 3)
725 },
new Func<
AIAct.Status>(this.KeepRunning));
726 return this.TickChild();
730 public AIAct.Status DoWait(
int count = 1)
735 },
new Func<
AIAct.Status>(this.KeepRunning));
736 return this.TickChild();
741 public virtual bool HasProgress
758 onProgressComplete =
new Action(this.OnProgressComplete),
759 canProgress =
new Func<bool>(this.CanProgress),
760 onBeforeProgress =
new Action(this.OnBeforeProgress)
762 this.OnCreateProgress(progress_Custom);
763 return progress_Custom;
772 public virtual bool CanProgress()
778 public virtual void OnBeforeProgress()
783 public virtual void OnProgress()
788 public virtual void OnProgressComplete()
793 public void SimulateZone(
int days)
795 if (this.owner.conSuspend !=
null)
799 this.OnSimulateZone(days);
803 public virtual void OnSimulateZone(
int days)
808 public virtual void OnSimulatePosition()
813 public new Chara owner;
816 public AIAct.Status status;
819 public IEnumerator<
AIAct.Status> Enumerator;
828 public byte restartCount;
831 public Func<
AIAct.Status> onChildFail;
834 public Func<bool> isFail;