Elin Decompiled Documentation EA 23.335 Nightly
Loading...
Searching...
No Matches
GoalCombat Class Reference
Inheritance diagram for GoalCombat:
Goal AIAct Act Element EClass GoalAutoCombat

Classes

class  ItemAbility
 

Public Member Functions

override bool CanManualCancel ()
 
override IEnumerable< StatusRun ()
 
bool TryMove (int dist)
 
void AddAbility (Act a, int mod=0, int chance=100, bool aiPt=false)
 
void TryAddAbility (int ele)
 
void TryRemoveAbility (int ele)
 
virtual bool TryUseRanged (int dist)
 
virtual bool TryThrow (int dist)
 
virtual bool TryFuse ()
 
virtual bool TryUseAbility (int dist, bool beforeMove=false)
 
virtual void BuildAbilityList ()
 
virtual bool TryAbortCombat ()
 
- Public Member Functions inherited from Goal
Goal Duplicate ()
 
- Public Member Functions inherited from AIAct
override string ToString ()
 
override MultiSprite GetStateIcon ()
 
virtual bool ShouldAllyAttack (Chara tg)
 
virtual Point GetDestination ()
 
AIProgress GetProgress ()
 
string GetCurrentActionText ()
 
override bool IsToolValid ()
 
GetChild< T > ()
 
virtual void OnStart ()
 
void SetOwner (Chara c)
 
virtual void OnSetOwner ()
 
void SetChild (AIAct seq, Func< Status > _onChildFail=null)
 
void Start ()
 
override bool Perform ()
 
Status Restart ()
 
Status Success (Action action=null)
 
virtual void OnSuccess ()
 
bool TryCancel (Card c)
 
virtual Status Cancel ()
 
virtual void OnCancel ()
 
virtual void OnCancelOrSuccess ()
 
virtual bool CanManualCancel ()
 
Status KeepRunning ()
 
void Reset ()
 
virtual void OnReset ()
 
Status Tick ()
 
virtual IEnumerable< StatusRun ()
 
Status TickChild ()
 
Status Do (AIAct _seq, Func< Status > _onChildFail=null)
 
Status DoGotoInteraction (Point pos, Func< Status > _onChildFail=null)
 
Status DoGoto (Point pos, int dist=0, bool ignoreConnection=false, Func< Status > _onChildFail=null)
 
Status DoGoto (Card card, Func< Status > _onChildFail=null)
 
Status DoGoto (Card card, int dist, bool ignoreConnection=false, Func< Status > _onChildFail=null)
 
Status DoGotoSpot (Card card, Func< Status > _onChildFail=null)
 
Status DoGoto< T > (Func< Status > _onChildFail=null)
 
Status DoGotoSpot< T > (Func< Status > _onChildFail=null, bool ignoreAccessType=false)
 
Status DoGrab (Card card, int num=-1, bool pickHeld=false, Func< Status > _onChildFail=null)
 
Status DoGrab< T > ()
 
Status DoProgress ()
 
Status DoIdle (int repeat=3)
 
Status DoWait (int count=1)
 
virtual AIProgress CreateProgress ()
 
virtual void OnCreateProgress (Progress_Custom p)
 
virtual bool CanProgress ()
 
virtual void OnBeforeProgress ()
 
virtual void OnProgress ()
 
virtual void OnProgressComplete ()
 
void SimulateZone (int days)
 
virtual void OnSimulateZone (int days)
 
virtual void OnSimulatePosition ()
 
- Public Member Functions inherited from Act
virtual CursorInfo GetCursorIcon (Card c)
 
virtual MultiSprite GetStateIcon ()
 
override Sprite GetSprite ()
 
virtual bool ShowMouseHint (Card c)
 
virtual bool IsValidTC (Card c)
 
virtual string GetHintText (string str="")
 
virtual string GetText (string str="")
 
virtual string GetTextSmall (Card c)
 
bool IsTargetHostileParty ()
 
virtual Color GetActPlanColor ()
 
virtual bool Perform ()
 
bool Perform (Chara _cc, Card _tc=null, Point _tp=null)
 
virtual bool ValidatePerform (Chara _cc, Card _tc, Point _tp)
 
virtual bool CanPerform ()
 
bool CanPerform (Chara _cc, Card _tc=null, Point _tp=null)
 
virtual bool IsToolValid ()
 
new void SetImage (Image image)
 
virtual void OnMarkMapHighlights ()
 
virtual bool ShouldMapHighlight (Point p)
 
- Public Member Functions inherited from Element
virtual SourceElement.Row GetSource ()
 
virtual int GetSourcePotential (int v)
 
virtual Sprite GetSprite ()
 
int GetMaterialSourceValue (Thing t, int v)
 
virtual long GetSourceValue (long v, int lv, SourceValueType type)
 
virtual Sprite GetIcon (string suffix="")
 
bool IsActive (Card c)
 
int SortVal (bool charaSheet=false)
 
virtual bool CanLink (ElementContainer owner)
 
bool HasTag (string tag)
 
void SetImage (Image i)
 
virtual string GetDetail ()
 
bool IsFactionElement (Chara c)
 
Element GetParent (Card c)
 
void WriteNote (UINote n, ElementContainer owner=null, Action< UINote > onWriteNote=null)
 
void WriteNoteWithRef (UINote n, ElementContainer owner, Action< UINote > onWriteNote, Element refEle)
 
void _WriteNote (UINote n, Chara c, Act act)
 
void AddHeaderAbility (UINote n)
 
void _WriteNote (UINote n, ElementContainer owner, Action< UINote > onWriteNote, bool isRef, bool addHeader=true)
 
void AddEncNote (UINote n, Card Card, ElementContainer.NoteMode mode=ElementContainer.NoteMode.Default, Func< Element, string, string > funcText=null, Action< UINote, Element > onAddNote=null)
 
virtual void OnWriteNote (UINote n, ElementContainer owner)
 
virtual void OnChangeValue ()
 
void CheckLevelBonus (ElementContainer owner, UINote n=null)
 
int GetSortVal (UIList.SortMode m)
 
virtual Act.Cost GetCost (Chara c)
 
virtual int GetPower (Card c)
 
virtual void SetTextValue (UIText text, bool shorten=false)
 
virtual bool IsPurchaseFeatReqMet (ElementContainer owner, int lv=-1)
 
virtual void WritePurchaseReq (UINote n, int lv=1)
 

Public Attributes

Chara destEnemy
 
Chara tc
 
int idleCount
 
int moveFail
 
List< ItemAbilityabilities
 
List< Characharas = new List<Chara>()
 
- Public Attributes inherited from AIAct
new Chara owner
 
Status status
 
IEnumerator< StatusEnumerator
 
AIAct child
 
AIAct parent
 
byte restartCount
 
Func< StatusonChildFail
 
Func< bool > isFail
 
- Public Attributes inherited from Element
SourceElement.Row _source
 
int id
 
int vBase
 
int vExp
 
int vPotential
 
int vTempPotential
 
int vLink
 
int vSource
 
int vSourcePotential
 
ElementContainer owner
 

Properties

override CursorInfo CursorIcon [get]
 
override bool CancelWhenDamaged [get]
 
override bool CancelOnAggro [get]
 
Tactics tactics [get]
 
- Properties inherited from Goal
override bool InformCancel [get]
 
override bool ShouldEndMimicry [get]
 
- Properties inherited from AIAct
virtual bool IsRunning [get]
 
bool IsChildRunning [get]
 
bool IsMoveAI [get]
 
virtual int MaxRestart [get]
 
virtual new string Name [get]
 
virtual MultiSprite stateIcon [get]
 
virtual Sprite actionIcon [get]
 
virtual bool IsNoGoal [get]
 
virtual bool IsAutoTurn [get]
 
virtual bool IsIdle [get]
 
virtual bool CancelOnAggro [get]
 
virtual bool PushChara [get]
 
virtual int MaxProgress [get]
 
virtual bool ShowProgress [get]
 
virtual bool UseTurbo [get]
 
virtual int CurrentProgress [get]
 
virtual bool ShowCursor [get]
 
virtual bool CancelWhenDamaged [get]
 
virtual bool CancelWhenMoved [get]
 
virtual bool InformCancel [get]
 
virtual Thing RenderThing [get]
 
AIAct Current [get]
 
override bool IsAct [get]
 
override bool ShowPotential [get]
 
override bool UsePotential [get]
 
override bool ShowRelativeAttribute [get]
 
virtual bool HasProgress [get]
 
- Properties inherited from Act
override bool ShowPotential [get]
 
override bool UsePotential [get]
 
override bool ShowRelativeAttribute [get]
 
virtual CursorInfo CursorIcon [get]
 
virtual string ID [get]
 
virtual bool IsAct [get]
 
virtual bool WillEndTurn [get]
 
virtual bool CloseLayers [get]
 
virtual int LeftHand [get]
 
virtual int RightHand [get]
 
virtual int ElementPowerMod [get]
 
virtual bool ShowMapHighlight [get]
 
virtual bool ShowMapHighlightBlock [get]
 
virtual bool PickHeldOnStart [get]
 
virtual bool DropHeldOnStart [get]
 
virtual bool CanPressRepeat [get]
 
virtual bool CanAutofire [get]
 
virtual bool ResetAxis [get]
 
virtual bool RequireTool [get]
 
virtual bool IsHostileAct [get]
 
virtual bool HideRightInfo [get]
 
virtual bool ShouldEndMimicry [get]
 
virtual bool HaveLongPressAction [get]
 
virtual float Radius [get]
 
virtual int PerformDistance [get]
 
virtual int MaxRadius [get]
 
virtual TargetType TargetType [get]
 
virtual bool LocalAct [get]
 
virtual bool CanRapidFire [get]
 
virtual float RapidDelay [get]
 
virtual bool ShowAuto [get]
 
- Properties inherited from Element
SourceElement.Row source [get]
 
virtual int DisplayValue [get]
 
virtual int MinValue [get]
 
int Value [get]
 
int ValueWithoutLink [get]
 
virtual int MinPotential [get]
 
int Potential [get]
 
virtual bool CanGainExp [get]
 
bool IsFlag [get]
 
virtual string Name [get]
 
virtual string FullName [get]
 
virtual int ExpToNext [get]
 
virtual bool UseExpMod [get]
 
virtual int CostTrain [get]
 
virtual int CostLearn [get]
 
virtual bool ShowXP [get]
 
virtual bool ShowMsgOnValueChanged [get]
 
virtual bool ShowValue [get]
 
virtual bool ShowPotential [get]
 
virtual bool UsePotential [get]
 
virtual bool PotentialAsStock [get]
 
virtual bool ShowRelativeAttribute [get]
 
virtual bool ShowBonuses [get]
 
virtual string ShortName [get]
 
bool IsGlobalElement [get]
 
bool IsFactionWideElement [get]
 
bool IsPartyWideElement [get]
 
virtual bool ShowEncNumber [get]
 
bool IsTrait [get]
 
bool IsFoodTrait [get]
 
bool IsFoodTraitMain [get]
 
bool IsMainAttribute [get]
 
Act act [get]
 
- Properties inherited from EClass
static Game game [get]
 
static bool AdvMode [get]
 
static Player player [get]
 
static Chara pc [get]
 
static UI ui [get]
 
static Map _map [get]
 
static Zone _zone [get]
 
static FactionBranch Branch [get]
 
static FactionBranch BranchOrHomeBranch [get]
 
static Faction Home [get]
 
static Faction Wilds [get]
 
static Scene scene [get]
 
static BaseGameScreen screen [get]
 
static GameSetting setting [get]
 
static GameData gamedata [get]
 
static ColorProfile Colors [get]
 
static World world [get]
 
static SourceManager sources [get]
 
static SourceManager editorSources [get]
 
static SoundManager Sound [get]
 
static CoreDebug debug [get]
 

Additional Inherited Members

- Public Types inherited from AIAct
enum  Status { Running , Fail , Success }
 
- Public Types inherited from Act
enum  CostType { None , MP , SP }
 
- Static Public Member Functions inherited from Act
static void SetReference (Chara _cc, Card _tc=null, Point _tp=null)
 
static void SetTool (Thing t)
 
- Static Public Member Functions inherited from Element
static string GetName (string alias)
 
static SourceElement.Row Get (int id)
 
static Dictionary< int, int > GetElementMap (int[] list)
 
static Dictionary< int, int > GetElementMap (int[] list, Dictionary< int, int > map)
 
static SourceElement.Row GetRandomElement (int lv=1, bool useWeight=true)
 
static Element Create (int id, int v=0)
 
static Element Create (string id, int v=1)
 
static int GetId (string alias)
 
static int GetResistLv (int v)
 
static long GetResistDamage (long dmg, int v, int power=0)
 
- Static Public Member Functions inherited from EClass
static int rndSeed (int a, int seed)
 
static int rnd (long a)
 
static int rnd (int a)
 
static int curve (long _a, int start, int step, int rate=75)
 
static int sqrt (int a)
 
static int rndHalf (int a)
 
static float rndf (float a)
 
static int rndSqrt (int a)
 
static void Wait (float a, Card c)
 
static void Wait (float a, Point p)
 
static int Bigger (int a, int b)
 
static int Smaller (int a, int b)
 
- Static Public Attributes inherited from Act
static Chara CC
 
static Card TC
 
static Point TP = new Point()
 
static Thing TOOL
 
static int powerMod = 100
 
static bool forcePt
 
static Act CurrentAct
 
- Static Public Attributes inherited from Element
const int Div = 5
 
static Element Void = new Element()
 
static int[] List_MainAttributes = new int[9] { 70, 72, 71, 77, 74, 75, 76, 73, 79 }
 
static int[] List_MainAttributesMajor = new int[8] { 70, 72, 71, 77, 74, 75, 76, 73 }
 
static int[] List_Body = new int[4] { 70, 72, 71, 77 }
 
static int[] List_Mind = new int[4] { 74, 75, 76, 73 }
 
static List< SourceElement.RowListElements = new List<SourceElement.Row>()
 
static List< SourceElement.RowListAttackElements = new List<SourceElement.Row>()
 
- Static Public Attributes inherited from EClass
static Core core
 

Detailed Description

Definition at line 5 of file GoalCombat.cs.

Member Function Documentation

◆ AddAbility()

void GoalCombat.AddAbility ( Act  a,
int  mod = 0,
int  chance = 100,
bool  aiPt = false 
)
inline

Definition at line 441 of file GoalCombat.cs.

442 {
443 abilities.Add(new ItemAbility
444 {
445 act = a,
446 priorityMod = mod,
447 chance = chance,
448 aiPt = aiPt
449 });
450 }
Act act
Definition: ELEMENT.cs:403
List< ItemAbility > abilities
Definition: GoalCombat.cs:34

References abilities, and Element.act.

Referenced by BuildAbilityList(), and TryAddAbility().

◆ BuildAbilityList()

virtual void GoalCombat.BuildAbilityList ( )
inlinevirtual

Reimplemented in GoalAutoCombat.

Definition at line 1239 of file GoalCombat.cs.

1240 {
1241 abilities.Clear();
1242 foreach (ActList.Item item in owner.ability.list.items)
1243 {
1245 {
1246 AddAbility(item.act, 0, item.chance, item.pt);
1247 }
1248 }
1249 if (owner.mimicry != null && owner.mimicry.IsChara)
1250 {
1251 foreach (ActList.Item item2 in owner.mimicry.Card.Chara.ability.list.items)
1252 {
1253 AddAbility(item2.act, 0, item2.chance, item2.pt);
1254 }
1255 }
1260 {
1261 TryAddAbility(6410);
1262 }
1263 }
Definition: ACT.cs:6
static ActRanged Ranged
Definition: ACT.cs:17
static ActMelee Melee
Definition: ACT.cs:15
static ActItem Item
Definition: ACT.cs:21
new Chara owner
Definition: AIAct.cs:14
List< Item > items
Definition: ActList.cs:14
virtual Chara Chara
Definition: Card.cs:2122
ActList list
Definition: CharaAbility.cs:13
override bool IsPC
Definition: Chara.cs:630
bool HasCondition(string alias)
Definition: Chara.cs:9970
CharaAbility ability
Definition: Chara.cs:428
ConBaseTransmuteMimic mimicry
Definition: Chara.cs:106
Definition: EClass.cs:6
static Game game
Definition: EClass.cs:9
static Player player
Definition: EClass.cs:13
ConfigAutoCombat autoCombat
Definition: Game.cs:94
Config config
Definition: Game.cs:219
void TryAddAbility(int ele)
Definition: GoalCombat.cs:452
void AddAbility(Act a, int mod=0, int chance=100, bool aiPt=false)
Definition: GoalCombat.cs:441
HashSet< int > favAbility
Definition: Player.cs:1134

References abilities, Chara.ability, AddAbility(), Game.Config.autoCombat, ConfigAutoCombat.bUseFav, ConfigAutoCombat.bUseInventory, ConBaseTransmuteMimic.Card, Card.Chara, Game.config, Player.favAbility, EClass.game, Chara.HasCondition(), ConBaseTransmuteMimic.IsChara, Chara.IsPC, ACT.Item, item, ActList.items, CharaAbility.list, ACT.Melee, Chara.mimicry, AIAct.owner, EClass.player, ACT.Ranged, and TryAddAbility().

Referenced by Run(), and TryAddAbility().

◆ CanManualCancel()

override bool GoalCombat.CanManualCancel ( )
inlinevirtual

Reimplemented from AIAct.

Definition at line 46 of file GoalCombat.cs.

47 {
48 if (owner != null)
49 {
50 return !owner.isBerserk;
51 }
52 return false;
53 }
bool isBerserk
Definition: Chara.cs:124

References Chara.isBerserk, and AIAct.owner.

◆ Run()

override IEnumerable< Status > GoalCombat.Run ( )
inlinevirtual

Reimplemented from AIAct.

Definition at line 55 of file GoalCombat.cs.

56 {
57 if (destEnemy != null)
58 {
59 owner.enemy = destEnemy;
60 destEnemy = null;
61 }
62 int count = 0;
63 int lostCount = 0;
64 bool dontWander = owner.IsPCParty && !owner.IsPC && EClass.game.config.tactics.dontWander;
65 while (true)
66 {
68 {
69 EClass._zone.SetAlarm(enable: true);
70 }
71 bool canSeeLos = false;
73 {
74 Debug.Log("â– " + owner.Name + "/" + count + "/" + lostCount);
75 }
77 {
78 owner.enemy = null;
79 owner.ShowEmo(Emo.happy);
80 yield return Success();
81 }
82 count++;
83 if (dontWander && owner.enemy != null && !EClass.pc.isBlind && !EClass.pc.CanSeeLos(owner.enemy) && (owner.Dist(EClass.pc) > 4 || owner.Dist(owner.enemy) > 1))
84 {
86 if (firstStep.IsValid && !firstStep.HasChara)
87 {
88 owner.enemy = null;
89 }
90 }
91 tc = owner.enemy;
92 if (tc != null && owner.IsPCFactionOrMinion)
93 {
95 {
96 owner.enemy = null;
97 yield return Success();
98 }
100 {
101 tc = (owner.enemy = null);
102 }
103 }
104 if (tc == null || tc.isDead || !tc.ExistsOnMap || !tc.pos.IsInBounds || lostCount >= (owner.IsPowerful ? 50 : 5) || !owner.CanSee(tc))
105 {
106 tc = (owner.enemy = null);
108 {
109 yield return Success();
110 }
112 lostCount = 0;
113 if (owner.enemy == null)
114 {
115 yield return Success();
116 }
117 tc = owner.enemy;
118 }
119 else
120 {
121 canSeeLos = owner.CanSeeLos(tc);
122 lostCount = ((!canSeeLos) ? (lostCount + 1) : 0);
123 }
124 if (owner.IsPC && tc.HasEditorTag(EditorTag.Invulnerable))
125 {
126 Msg.Say("abort_idle");
127 yield return Success();
128 }
129 if (tc.IsPCFaction && owner.id == "melilith_boss" && EClass._map.plDay.list.Count > 1 && EClass._map.plDay.list[0].data.id != 107)
130 {
131 EClass._zone.SetBGM(107);
132 }
133 if (abilities == null)
134 {
135 abilities = new List<ItemAbility>();
137 }
138 if (owner.IsPCFaction && tc.IsPCFaction && EClass.rnd(5) == 0 && count > 2)
139 {
140 CalmDown();
141 yield return Success();
142 }
144 {
145 if (owner.calmCheckTurn < 0 || (!owner.enemy.IsPCParty && EClass.rnd(10) == 0))
146 {
147 CalmDown();
148 yield return Success();
149 }
151 }
153 {
154 foreach (Chara chara in EClass._map.charas)
155 {
156 if (!chara.IsPCFactionOrMinion && !chara.IsInCombat && chara != owner && chara.trait is TraitBigDaddy)
157 {
158 chara.GoHostile(tc);
159 }
160 }
161 }
162 if (owner.IsPC)
163 {
164 CursorSystem.ignoreCount = 1;
165 }
166 if (tc.host != null && (tc.hp == 0 || EClass.rnd(5) == 0 || tc.host.isRestrained))
167 {
169 }
170 if (tc.parasite != null && !tc.isRestrained && tc.parasite.hp > 0 && EClass.rnd(5) == 0)
171 {
173 }
174 if (tc.ride != null && !tc.isRestrained && tc.ride.hp > 0 && EClass.rnd(5) == 0)
175 {
177 }
178 if (tc.enemy != null)
179 {
181 }
182 if (TryFuse())
183 {
184 yield return Success();
185 }
186 if (!tc.IsMinion && EClass.rnd(10) == 0 && EClass.rnd(tc.DEX + 10) > owner.LV && tc.HasElement(1315) && !owner.HasElement(1315) && owner.IsMachine && owner.CanBeTempAlly(tc) && owner.id != "mech_scarab")
187 {
188 owner.Say("dominate_machine", tc, owner);
189 owner.PlayEffect("boost");
190 owner.PlaySound("boost");
191 owner.ShowEmo(Emo.love);
192 owner.lastEmo = Emo.angry;
194 yield return Success();
195 }
196 if (EClass.rnd(5) == 0 && tc.HasElement(1325) && owner.IsPlant && owner.CanBeTempAlly(tc))
197 {
198 owner.Say("dominate_plant", tc, owner);
199 owner.ShowEmo(Emo.love);
200 owner.lastEmo = Emo.angry;
202 yield return Success();
203 }
204 if (EClass.rnd(20) == 0 && owner.isRestrained)
205 {
206 owner.Talk("restrained");
207 }
208 if (this is GoalAutoCombat)
209 {
211 EClass.pc.ModExp(135, 20);
212 }
213 int dist = owner.Dist(tc);
214 bool move = owner.host == null && (tactics.ChanceMove > EClass.rnd(100) || (owner.IsPC && tc.HasCondition<ConFear>() && dist >= EClass.pc.GetSightRadius() - 1));
215 bool haltSecondMove = false;
216 if (!owner.IsPC && owner.IsNeutralOrAbove() && !owner.isBlind && !owner.isSummon && !owner.IsMinion)
217 {
218 int num = -1;
219 if (tc.HasElement(1221))
220 {
221 num = 1;
222 }
223 if (tc.source.HasTag(CTAG.suicide) && !tc.HasCondition<ConWet>())
224 {
225 num = 3;
226 }
227 if (num > 0)
228 {
229 if (dist <= num)
230 {
231 if (EClass.rnd(15) == 0)
232 {
233 owner.Talk("run_suicide");
234 }
235 if (owner.host == null && owner.TryMoveFrom(tc.pos) != 0)
236 {
237 yield return Status.Running;
238 idleCount = 0;
239 continue;
240 }
242 {
243 Debug.Log("Failed to Run: " + owner.Name);
244 }
245 }
246 if (dist == num + 1)
247 {
248 haltSecondMove = true;
249 move = false;
250 idleCount = 0;
251 }
252 }
253 }
254 if (dontWander)
255 {
256 int num2 = owner.Dist(EClass.pc);
257 if (num2 > 3)
258 {
259 int x = tc.pos.x;
260 int z = tc.pos.z;
261 if (EClass.pc.pos.Distance(owner.pos.x + ((x > owner.pos.x) ? 1 : ((x < owner.pos.x) ? (-1) : 0)), owner.pos.z + ((z > owner.pos.z) ? 1 : ((z < owner.pos.z) ? (-1) : 0))) >= num2)
262 {
263 move = false;
264 haltSecondMove = true;
265 }
266 }
267 }
268 if ((owner.IsPC && EClass.game.config.autoCombat.bDontChase) || (!canSeeLos && tc.isHidden))
269 {
270 move = false;
271 haltSecondMove = true;
272 }
274 {
275 Debug.Log(owner.Name + "/" + move + "/" + haltSecondMove + "/" + dist);
276 }
277 if (move)
278 {
279 if (owner.IsPC && dist <= owner.GetSightRadius() && TryUseAbility(dist, beforeMove: true))
280 {
281 yield return Status.Running;
282 idleCount = 0;
283 continue;
284 }
285 if (TryMove(dist))
286 {
288 {
289 Debug.Log("moved:" + owner.Name);
290 }
291 yield return Status.Running;
292 idleCount = 0;
293 continue;
294 }
295 }
296 if (owner == null)
297 {
298 yield return Cancel();
299 }
300 if (dist <= owner.GetSightRadius() && TryUseAbility(dist))
301 {
302 yield return Status.Running;
303 idleCount = 0;
304 continue;
305 }
307 {
308 Debug.Log(owner.Name + "/" + move + "/" + haltSecondMove + "/" + tactics.ChanceSecondMove);
309 }
310 if (!move && !haltSecondMove && tactics.ChanceSecondMove > EClass.rnd(100) && TryMove(dist))
311 {
312 yield return Status.Running;
313 idleCount = 0;
314 continue;
315 }
316 if (owner == null)
317 {
318 yield return Cancel();
319 }
320 idleCount++;
321 if (TryAbortCombat())
322 {
323 yield return Success();
324 }
325 if (idleCount > 1 && owner.id == "keeper_garden" && owner.enemy != null)
326 {
327 owner.Teleport(owner.enemy.pos.GetNearestPoint(allowBlock: false, allowChara: false, allowInstalled: true, ignoreCenter: true, 3) ?? EClass._map.GetRandomSurface(), silent: false, force: true);
328 yield return Success();
329 }
330 if (idleCount > 2)
331 {
332 if (dontWander)
333 {
334 yield return Success();
335 }
336 idleCount = 0;
337 string aiIdle = owner.source.aiIdle;
338 if (aiIdle == "stand" || aiIdle == "root")
339 {
340 yield return Success();
341 }
342 if (owner.tactics.DestDist > 4)
343 {
344 yield return Success();
345 }
346 yield return DoGoto(tc.pos);
347 }
348 else if (owner.FindNearestNewEnemy())
349 {
350 yield return Status.Running;
351 continue;
352 }
353 yield return Status.Running;
354 }
355 void CalmDown()
356 {
357 owner.enemy = null;
358 if (owner.ride != null)
359 {
360 owner.ride.enemy = null;
361 }
362 if (owner.parasite != null)
363 {
364 owner.parasite.enemy = null;
365 }
366 owner.hostility = owner.OriginalHostility;
367 if (tc.enemy == owner)
368 {
369 tc.enemy = null;
370 if (tc.ride != null)
371 {
372 tc.ride.enemy = null;
373 }
374 if (tc.parasite != null)
375 {
376 tc.parasite.enemy = null;
377 }
378 tc.hostility = tc.OriginalHostility;
379 }
380 owner.Say("calmDown", owner);
381 }
382 }
BossType
Definition: BossType.cs:2
CTAG
Definition: CTAG.cs:2
EditorTag
Definition: EditorTag.cs:2
Emo
Definition: Emo.cs:2
Hostility
Definition: Hostility.cs:2
MinionType
Definition: MinionType.cs:2
virtual Status Cancel()
Definition: AIAct.cs:305
virtual bool ShouldAllyAttack(Chara tg)
Definition: AIAct.cs:134
Status
Definition: AIAct.cs:8
Status DoGoto(Point pos, int dist=0, bool ignoreConnection=false, Func< Status > _onChildFail=null)
Definition: AIAct.cs:446
void SetTurbo(int mtp=-1)
Definition: AM_Adv.cs:1091
static AM_Adv Adv
Definition: ActionMode.cs:15
bool IsPCFactionOrMinion
Definition: Card.cs:2342
void Teleport(Point point, bool silent=false, bool force=false)
Definition: Card.cs:6182
string id
Definition: Card.cs:36
int GetSightRadius()
Definition: Card.cs:6887
bool isRestrained
Definition: Card.cs:569
SoundSource PlaySound(string id, float v=1f, bool spatial=true)
Definition: Card.cs:6633
void Talk(string idTopic, string ref1=null, string ref2=null, bool forceSync=false)
Definition: Card.cs:7193
int hp
Definition: Card.cs:245
string Name
Definition: Card.cs:2191
bool ExistsOnMap
Definition: Card.cs:2137
Point pos
Definition: Card.cs:60
int DEX
Definition: Card.cs:2405
MoveResult TryMoveFrom(Point p)
Definition: Card.cs:6240
Effect PlayEffect(string id, bool useRenderPos=true, float range=0f, Vector3 fix=default(Vector3))
Definition: Card.cs:6667
void ShowEmo(Emo _emo=Emo.none, float duration=0f, bool skipSame=true)
Definition: Card.cs:6601
bool IsPowerful
Definition: Card.cs:2146
bool HasEditorTag(EditorTag tag)
Definition: Card.cs:2733
BossType c_bossType
Definition: Card.cs:1261
int Dist(Card c)
Definition: Card.cs:8192
bool isHidden
Definition: Card.cs:533
void ModExp(string alias, int a)
Definition: Card.cs:2781
bool HasElement(int ele, bool includeNagative=false)
Definition: Card.cs:6371
int LV
Definition: Card.cs:389
void Say(string lang, string ref1=null, string ref2=null)
Definition: Card.cs:7311
Definition: Chara.cs:10
new TraitChara trait
Definition: Chara.cs:509
Hostility OriginalHostility
Definition: Chara.cs:475
AIAct ai
Definition: Chara.cs:206
Chara host
Definition: Chara.cs:33
bool IsPlant
Definition: Chara.cs:1022
Point GetFirstStep(Point newPoint, PathManager.MoveType moveType=PathManager.MoveType.Default)
Definition: Chara.cs:2804
bool CanSeeLos(Card c, int dist=-1)
Definition: Chara.cs:1309
override bool IsPCParty
Definition: Chara.cs:633
bool IsInCombat
Definition: Chara.cs:911
bool IsNeutralOrAbove()
Definition: Chara.cs:6925
override bool IsMinion
Definition: Chara.cs:645
override bool IsPCFaction
Definition: Chara.cs:689
int calmCheckTurn
Definition: Chara.cs:118
void MakeMinion(Chara _master, MinionType type=MinionType.Default)
Definition: Chara.cs:2556
bool CanSee(Card c)
Definition: Chara.cs:1277
override bool IsPCFactionMinion
Definition: Chara.cs:673
SourceChara.Row source
Definition: Chara.cs:162
bool FindNewEnemy()
Definition: Chara.cs:6785
void GoHostile(Card _tg)
Definition: Chara.cs:6668
Chara parasite
Definition: Chara.cs:30
Chara ride
Definition: Chara.cs:27
bool CanBeTempAlly(Chara c)
Definition: Chara.cs:2534
bool FindNearestNewEnemy()
Definition: Chara.cs:6858
Chara enemy
Definition: Chara.cs:86
Chara SetEnemy(Chara c=null)
Definition: Chara.cs:6643
bool isBlind
Definition: Chara.cs:132
bool IsMachine
Definition: Chara.cs:950
Tactics tactics
Definition: Chara.cs:857
bool isDead
Definition: Chara.cs:393
void TrySetEnemy(Chara c)
Definition: Chara.cs:6660
Definition: ConWet.cs:2
bool logCombat
Definition: CoreDebug.cs:260
static Zone _zone
Definition: EClass.cs:21
static Map _map
Definition: EClass.cs:19
static int rnd(long a)
Definition: EClass.cs:59
static Chara pc
Definition: EClass.cs:15
static CoreDebug debug
Definition: EClass.cs:49
ConfigTactics tactics
Definition: Game.cs:91
virtual void BuildAbilityList()
Definition: GoalCombat.cs:1239
Chara tc
Definition: GoalCombat.cs:28
Tactics tactics
Definition: GoalCombat.cs:44
int idleCount
Definition: GoalCombat.cs:30
virtual bool TryAbortCombat()
Definition: GoalCombat.cs:1265
virtual bool TryFuse()
Definition: GoalCombat.cs:514
bool TryMove(int dist)
Definition: GoalCombat.cs:384
Chara destEnemy
Definition: GoalCombat.cs:26
virtual bool TryUseAbility(int dist, bool beforeMove=false)
Definition: GoalCombat.cs:524
Point GetRandomSurface(int x, int z, int radius, bool walkable=true, bool allowWater=false)
Definition: MapBounds.cs:182
Playlist plDay
Definition: Map.cs:77
List< Chara > charas
Definition: Map.cs:81
Definition: Msg.cs:5
static string Say(string idLang, string ref1, string ref2=null, string ref3=null, string ref4=null)
Definition: Msg.cs:58
bool IsCriminal
Definition: Player.cs:1409
Definition: Point.cs:9
int x
Definition: Point.cs:36
Point GetNearestPoint(bool allowBlock=false, bool allowChara=true, bool allowInstalled=true, bool ignoreCenter=false, int minRadius=0)
Definition: Point.cs:624
int z
Definition: Point.cs:39
bool IsValid
Definition: Point.cs:88
int Distance(Point p)
Definition: Point.cs:995
bool IsInBounds
Definition: Point.cs:104
bool HasChara
Definition: Point.cs:238
bool isAlarmSet
Definition: Spatial.cs:430
bool isPeace
Definition: Spatial.cs:406
int ChanceSecondMove
Definition: Tactics.cs:56
int DestDist
Definition: Tactics.cs:24
virtual bool SetAlarmOnBreakLaw
Definition: Zone.cs:235
void SetBGM(List< int > ids, bool refresh=true, float fadeDuration=0f)
Definition: Zone.cs:3175
virtual void SetAlarm(bool enable)
Definition: Zone.cs:3804

References EClass._map, EClass._zone, abilities, ConfigAutoCombat.abortOnKill, ActionMode.Adv, Chara.ai, Game.Config.autoCombat, ConfigAutoCombat.bDontChase, BuildAbilityList(), Card.c_bossType, Chara.calmCheckTurn, Chara.CanBeTempAlly(), AIAct.Cancel(), Chara.CanSee(), Chara.CanSeeLos(), Tactics.ChanceSecondMove, Map.charas, Game.config, EClass.debug, Debug, Tactics.DestDist, destEnemy, Card.DEX, Card.Dist(), Point.Distance(), AIAct.DoGoto(), ConfigTactics.dontWander, Chara.enemy, Card.ExistsOnMap, Chara.FindNearestNewEnemy(), Chara.FindNewEnemy(), EClass.game, Chara.GetFirstStep(), Point.GetNearestPoint(), MapBounds.GetRandomSurface(), Card.GetSightRadius(), Chara.GoHostile(), Point.HasChara, Chara.HasCondition(), Card.HasEditorTag(), Card.HasElement(), Chara.host, Card.hp, Card.id, idleCount, Spatial.isAlarmSet, Chara.isBlind, Player.IsCriminal, Chara.isDead, Card.isHidden, Point.IsInBounds, Chara.IsInCombat, Chara.IsMachine, Chara.IsMinion, Chara.IsNeutralOrAbove(), Chara.IsPC, Chara.IsPCFaction, Chara.IsPCFactionMinion, Card.IsPCFactionOrMinion, Chara.IsPCParty, Spatial.isPeace, Chara.IsPlant, Card.IsPowerful, Card.isRestrained, Point.IsValid, CoreDebug.logCombat, Card.LV, Chara.MakeMinion(), Card.ModExp(), Card.Name, Chara.OriginalHostility, AIAct.owner, Chara.parasite, EClass.pc, Card.PlayEffect(), EClass.player, Card.PlaySound(), Map.plDay, Card.pos, Chara.ride, EClass.rnd(), Msg.Say(), Card.Say(), Zone.SetAlarm(), Zone.SetAlarmOnBreakLaw, Zone.SetBGM(), Chara.SetEnemy(), AM_Adv.SetTurbo(), AIAct.ShouldAllyAttack(), Card.ShowEmo(), Chara.source, AIAct.Success, Chara.tactics, Game.Config.tactics, tactics, Card.Talk(), tc, Card.Teleport(), Chara.trait, TryAbortCombat(), TryFuse(), TryMove(), Card.TryMoveFrom(), Chara.TrySetEnemy(), TryUseAbility(), ConfigAutoCombat.turbo, Point.x, and Point.z.

◆ TryAbortCombat()

virtual bool GoalCombat.TryAbortCombat ( )
inlinevirtual

Reimplemented in GoalAutoCombat.

Definition at line 1265 of file GoalCombat.cs.

1266 {
1267 return false;
1268 }

Referenced by Run().

◆ TryAddAbility()

void GoalCombat.TryAddAbility ( int  ele)
inline

Definition at line 452 of file GoalCombat.cs.

453 {
454 if (abilities == null)
455 {
457 }
458 foreach (ItemAbility ability in abilities)
459 {
460 Act obj = ability.act;
461 if (obj != null && obj.id == ele)
462 {
463 return;
464 }
465 }
466 AddAbility(Element.Create(ele) as Act);
467 }
Definition: ACT.cs:62
int id
Definition: ELEMENT.cs:259
static Element Create(int id, int v=0)
Definition: ELEMENT.cs:1130

References abilities, GoalCombat.ItemAbility.act, AddAbility(), BuildAbilityList(), Element.Create(), and Element.id.

Referenced by BuildAbilityList().

◆ TryFuse()

virtual bool GoalCombat.TryFuse ( )
inlinevirtual

Definition at line 514 of file GoalCombat.cs.

515 {
516 string text = owner.id;
517 if ((text == "imotoroid" || text == "marshmallow_monster") && owner.TryFuse(0.05f))
518 {
519 return true;
520 }
521 return false;
522 }
bool TryFuse(float chance=1f)
Definition: Chara.cs:1830

References Card.id, AIAct.owner, and Chara.TryFuse().

Referenced by Run().

◆ TryMove()

bool GoalCombat.TryMove ( int  dist)
inline

Definition at line 384 of file GoalCombat.cs.

385 {
387 {
388 Debug.Log("TryMove: " + owner.Name + "/" + dist);
389 }
390 if (owner.host != null)
391 {
392 return false;
393 }
394 if (owner.isBlind)
395 {
396 return owner.MoveRandom();
397 }
398 int num = (tc.HasCondition<ConFear>() ? 1 : tactics.DestDist);
399 if (!owner.IsPC && (tactics.source.id == "archer" || tactics.source.id == "gunner") && !owner.TryEquipRanged())
400 {
401 num = 1;
402 }
403 if (!owner.IsPC && num > 1)
404 {
405 if (tactics.DestDist == 2)
406 {
407 if (EClass.rnd(5) == 0)
408 {
409 num = 1;
410 }
411 }
412 else if (owner.turn / 3 % 5 > 2)
413 {
414 num--;
415 }
416 }
417 bool flag = false;
418 if (dist > num)
419 {
420 flag = owner.TryMoveTowards(tc.pos) != Card.MoveResult.Fail;
421 if (!flag)
422 {
423 moveFail++;
424 }
425 }
426 else if (dist < num)
427 {
428 flag = owner.TryMoveFrom(tc.pos) != Card.MoveResult.Fail;
429 }
430 if (flag)
431 {
432 moveFail = 0;
433 }
435 {
436 Debug.Log("TryMove:" + owner.Name + "/" + flag + "/" + dist + "/" + num);
437 }
438 return flag;
439 }
Definition: Card.cs:11
MoveResult
Definition: Card.cs:13
int turn
Definition: Card.cs:68
bool MoveRandom()
Definition: Chara.cs:2809
MoveResult TryMoveTowards(Point p)
Definition: Chara.cs:2849
bool TryEquipRanged()
Definition: Chara.cs:8274
int moveFail
Definition: GoalCombat.cs:32
SourceTactics.Row source
Definition: Tactics.cs:3

References EClass.debug, Debug, Tactics.DestDist, Chara.HasCondition(), Chara.host, Chara.isBlind, Chara.IsPC, CoreDebug.logCombat, moveFail, Chara.MoveRandom(), Card.Name, AIAct.owner, Card.pos, EClass.rnd(), Tactics.source, tactics, tc, Chara.TryEquipRanged(), Card.TryMoveFrom(), Chara.TryMoveTowards(), and Card.turn.

Referenced by Run().

◆ TryRemoveAbility()

void GoalCombat.TryRemoveAbility ( int  ele)
inline

Definition at line 469 of file GoalCombat.cs.

470 {
471 if (abilities == null)
472 {
473 return;
474 }
475 foreach (ItemAbility ability in abilities)
476 {
477 Act obj = ability.act;
478 if (obj != null && obj.id == ele)
479 {
480 abilities.Remove(ability);
481 break;
482 }
483 }
484 }

References abilities, GoalCombat.ItemAbility.act, and Element.id.

◆ TryThrow()

virtual bool GoalCombat.TryThrow ( int  dist)
inlinevirtual

Definition at line 495 of file GoalCombat.cs.

496 {
497 if (dist > owner.GetSightRadius())
498 {
499 return false;
500 }
501 Thing thing = owner.TryGetThrowable();
502 if (thing == null)
503 {
504 return false;
505 }
506 if (!ACT.Throw.CanPerform(owner, tc, tc.pos))
507 {
508 return false;
509 }
510 ActThrow.Throw(owner, tc.pos, tc, thing.HasElement(410) ? thing : thing.Split(1));
511 return true;
512 }
static ActThrow Throw
Definition: ACT.cs:19
static EffectIRenderer Throw(Card c, Point p, Thing t, ThrowMethod method=ThrowMethod.Default, float failChance=0f)
Definition: ActThrow.cs:97
override bool CanPerform()
Definition: ActThrow.cs:29
Thing Split(int a)
Definition: Card.cs:3662
Thing TryGetThrowable()
Definition: Chara.cs:8193
Definition: Thing.cs:8

References ActThrow.CanPerform(), Card.GetSightRadius(), Card.HasElement(), AIAct.owner, Card.pos, Card.Split(), tc, ACT.Throw, ActThrow.Throw(), and Chara.TryGetThrowable().

Referenced by TryUseAbility().

◆ TryUseAbility()

virtual bool GoalCombat.TryUseAbility ( int  dist,
bool  beforeMove = false 
)
inlinevirtual

Definition at line 524 of file GoalCombat.cs.

525 {
526 if (abilities.Count == 0)
527 {
528 Debug.Log("no ability:" + owner);
529 return false;
530 }
531 int numEnemy = -1;
532 int numFriend = -1;
533 int numNeutral = -1;
534 bool charaBuilt = false;
535 bool flag = owner.CanSeeLos(tc, dist);
536 bool isPCFaction = owner.IsPCFaction;
537 bool flag2 = owner.HasCondition<ConSilence>();
538 bool isBlind = owner.isBlind;
539 bool flag3 = owner.HasCondition<ConFear>();
540 bool isConfused = owner.isConfused;
541 bool flag4 = owner.HasCondition<ConDim>();
542 bool flag5 = owner.HasCondition<ConSupress>();
543 foreach (ItemAbility ability in abilities)
544 {
545 Act act = ability.act;
546 if (act.id == 8801 && owner.race.id == "spider" && EClass._zone.HasField(10000) && !owner.IsPCFactionOrMinion)
547 {
548 ability.act = ACT.Create(50413);
549 }
550 ability.priority = 0;
551 ability.tg = null;
552 ability.pt = false;
553 if (EClass.rnd(100) >= ability.chance || (isBlind && act.HasTag("reqSight")) || (owner.isBerserk && !(act is ActMelee) && !(act is ActRanged) && !(act is ActBreathe) && !(act is ActThrow)))
554 {
555 continue;
556 }
557 int num = 0;
559 if (s.abilityType.Length == 0 || (owner.IsPC && flag2 && act is Spell) || (beforeMove && !act.HasTag("before_move")))
560 {
561 continue;
562 }
563 string text = s.abilityType[0];
564 if (flag5 && !(text == "melee") && !(text == "range") && EClass.rnd(2) == 0)
565 {
566 continue;
567 }
568 bool isHOT;
569 switch (text)
570 {
571 case "any":
572 num = 50;
573 break;
574 case "item":
575 num = (act as ActItem).BuildAct(owner);
576 break;
577 case "wait":
578 if (owner.IsPCParty)
579 {
580 continue;
581 }
582 num = 50;
583 break;
584 case "taunt":
585 {
586 bool flag9 = owner.HasCondition<StanceTaunt>();
587 bool flag10 = tactics.source.taunt != -1 && 100 * owner.hp / owner.MaxHP >= tactics.source.taunt;
588 num = ((flag9 && !flag10) ? 100 : ((!flag9 && flag10) ? 100 : 0));
589 break;
590 }
591 case "song":
592 {
593 BaseSong baseSong = owner.GetCondition(act.source.proc[1]) as BaseSong;
594 bool num2 = baseSong != null;
595 bool flag8 = num2 && act.GetPower(owner) > baseSong.power;
596 num = ((!num2 || flag8) ? 200 : 0);
597 break;
598 }
599 case "melee":
600 if (tactics.source.melee == 0 || dist > owner.body.GetMeleeDistance())
601 {
602 continue;
603 }
604 num = ((!flag3) ? tactics.P_Melee : ((!owner.IsPC) ? (tactics.P_Melee / 2) : 0));
605 if (isConfused)
606 {
607 num -= (owner.IsPC ? 30 : 10);
608 }
609 if (isBlind)
610 {
611 num -= (owner.IsPC ? 50 : 10);
612 }
613 if (dist <= 1)
614 {
615 if (tc.HasElement(1221))
616 {
617 num -= 40;
618 }
619 if (tc.HasElement(1223))
620 {
621 num -= 40;
622 }
623 if (!owner.IsPC && owner.IsPCFaction && tc.id == "hedgehog_ether")
624 {
625 continue;
626 }
627 if (!owner.IsPCFaction && num < 10)
628 {
629 num = 10;
630 }
631 }
632 break;
633 case "range":
634 if (!flag || EClass.rnd(100) > tactics.RangedChance)
635 {
636 continue;
637 }
638 num = ((!flag3) ? tactics.P_Range : ((!owner.IsPC) ? (tactics.P_Range / 2) : 0));
639 if (isConfused)
640 {
641 num -= (owner.IsPC ? 30 : 10);
642 }
643 if (isBlind)
644 {
645 num -= (owner.IsPC ? 50 : 10);
646 }
647 if (owner.ranged != null && owner.ranged.trait is TraitToolRangeCane && owner.mana.value <= 0)
648 {
649 continue;
650 }
651 break;
652 case "teleport":
653 num = 40;
654 break;
655 case "hot":
656 case "heal":
657 isHOT = text == "hot";
658 num = ForeachChara(ability, (Chara c) => HealFactor(c), isFriendlyAbility: true);
659 if (ability.aiPt || (owner.IsPC && tactics.CastPartyBuff))
660 {
661 ability.pt = true;
662 }
663 break;
664 case "dot":
665 case "attack":
666 case "attackMelee":
667 {
668 if (!flag)
669 {
670 continue;
671 }
672 bool flag7 = text == "dot";
673 if (flag7 && (owner.isRestrained || (tc != null && tc.IsRestrainedResident)))
674 {
675 continue;
676 }
677 num = ((text == "attackMelee") ? tactics.P_Melee : tactics.P_Spell) + GetAttackMod(act);
678 if (num > 0 && flag7)
679 {
680 num += 10;
681 }
682 if (ability.aiPt)
683 {
684 ability.pt = true;
685 }
686 break;
687 }
688 case "attackArea":
689 {
690 if (owner.isRestrained || (tc != null && tc.IsRestrainedResident))
691 {
692 continue;
693 }
694 bool flag6 = act is ActBolt;
695 if ((owner.pos.IsBlocked && (flag6 || act is ActBall || act is ActBreathe)) || !flag || (owner.IsPCParty && (EClass._zone.IsTown || EClass._zone.IsPCFaction)) || (act.id == 9150 && EClass._zone.IsPCFaction && owner.IsNeutralOrAbove()))
696 {
697 continue;
698 }
699 GetNumEnemy(flag6 ? 6 : 5);
700 if (numEnemy == 0 || (owner.IsPCFactionOrMinion && GetNumNeutral(flag6 ? 6 : 5) > 0))
701 {
702 continue;
703 }
704 num = tactics.P_Spell - 20 + numEnemy * 10 + GetAttackMod(act);
705 break;
706 }
707 case "buff":
708 num = ForeachChara(ability, (Chara c) => (!c.HasCondition(s.proc[1])) ? tactics.P_Buff : 0, isFriendlyAbility: true);
709 if (ability.aiPt || (owner.IsPC && tactics.CastPartyBuff))
710 {
711 ability.pt = true;
712 }
713 break;
714 case "buffStats":
715 num = ForeachChara(ability, delegate(Chara c)
716 {
717 Element buffStats2 = c.GetBuffStats(s.proc[1]);
718 return (buffStats2 == null || buffStats2.Value < 0) ? tactics.P_Buff : 0;
719 }, isFriendlyAbility: true);
720 if (ability.aiPt || (owner.IsPC && tactics.CastPartyBuff))
721 {
722 ability.pt = true;
723 }
724 break;
725 case "cure":
726 num = ForeachChara(ability, (Chara c) => c.CountDebuff() * 30, isFriendlyAbility: true);
727 if (ability.aiPt || (owner.IsPC && tactics.CastPartyBuff))
728 {
729 ability.pt = true;
730 }
731 break;
732 case "debuff":
733 if (!flag)
734 {
735 continue;
736 }
737 num = tactics.P_Debuff;
738 if (ability.aiPt)
739 {
740 ability.pt = true;
741 }
742 break;
743 case "debuffStats":
744 if (!flag)
745 {
746 continue;
747 }
748 num = ForeachChara(ability, delegate(Chara c)
749 {
750 Element buffStats = c.GetBuffStats(s.proc[1]);
751 return (buffStats == null || buffStats.Value > 0) ? tactics.P_Debuff : 0;
752 }, isFriendlyAbility: false);
753 if (ability.aiPt)
754 {
755 ability.pt = true;
756 }
757 break;
758 case "ground":
759 if (!flag || owner.isRestrained || (tc != null && tc.IsRestrainedResident))
760 {
761 continue;
762 }
763 num = 50;
764 if (isPCFaction)
765 {
766 num -= 10;
767 }
768 break;
769 case "summon":
770 {
771 if (owner.isRestrained || (tc != null && tc.IsRestrainedResident))
772 {
773 continue;
774 }
775 int num3 = EClass._zone.CountMinions(owner);
776 if (num3 >= owner.MaxSummon)
777 {
778 continue;
779 }
780 num = tactics.P_Summon - 20 * num3 / owner.MaxSummon;
781 break;
782 }
783 case "summonAlly":
784 if (owner.isRestrained || (tc != null && tc.IsRestrainedResident))
785 {
786 continue;
787 }
788 if (owner.IsPC)
789 {
790 if (EClass.player.lastEmptyAlly <= 0)
791 {
792 continue;
793 }
794 }
795 else if (EClass._zone.CountMinions(owner) > 0)
796 {
797 continue;
798 }
799 num = tactics.P_Summon;
800 break;
801 case "summonSpecial":
802 if (owner.GetInt(70) > EClass.world.date.GetRaw())
803 {
804 continue;
805 }
806 num = 1000;
807 break;
808 case "summonSpecial2":
809 num = 1000;
810 break;
811 case "suicide":
813 {
814 continue;
815 }
816 if (owner.HasTag(CTAG.kamikaze))
817 {
818 num = ((dist <= 1) ? 1000 : 0);
819 break;
820 }
821 num = 100 - 125 * owner.hp / owner.MaxHP;
822 if (EClass.rnd(200) <= num && (!owner.IsPowerful || owner.hp < owner.MaxHP / 2))
823 {
824 break;
825 }
826 continue;
827 default:
828 num = 0;
829 break;
830 }
831 switch (act.id)
832 {
833 case 6802:
835 {
836 continue;
837 }
838 break;
839 case 6606:
840 if (owner.mana.value <= 0)
841 {
842 continue;
843 }
844 break;
845 case 6603:
846 if (!tc.IsPCParty || tc.Evalue(418) < 0)
847 {
848 break;
849 }
850 foreach (Chara member in EClass.pc.party.members)
851 {
852 if (member.Evalue(418) < 0)
853 {
854 owner.enemy = (tc = member);
855 return false;
856 }
857 }
858 break;
859 case 6602:
860 if (dist <= 1 || tc.HasCondition<ConEntangle>())
861 {
862 continue;
863 }
864 break;
865 case 6450:
866 if (isPCFaction && (tc.HasElement(1221) || tc.HasElement(1223) || tc.id == "hedgehog_ether"))
867 {
868 continue;
869 }
870 break;
871 case 8200:
872 case 8201:
873 if (owner.HasElement(400))
874 {
875 continue;
876 }
877 break;
878 case 6400:
879 if (isPCFaction)
880 {
881 continue;
882 }
883 break;
884 case 8790:
885 case 8791:
886 if (tc.host != null)
887 {
888 continue;
889 }
890 break;
891 case 6900:
892 if (owner.IsPC)
893 {
894 continue;
895 }
896 if (owner.IsPCParty)
897 {
898 foreach (Chara member2 in EClass.pc.party.members)
899 {
900 float num5 = 100f - (float)(member2.mana.value * 100) / MathF.Max(1f, member2.mana.max);
901 if (num5 > (float)num)
902 {
903 num = (int)num5;
904 }
905 }
906 }
907 else
908 {
909 num = 100 - owner.mana.value * 100 / Mathf.Max(1, owner.mana.max);
910 }
911 break;
912 case 6627:
914 {
915 continue;
916 }
917 num = 100 - owner.hp * 100 / Mathf.Max(1, owner.MaxHP);
918 break;
919 case 9200:
920 {
921 int num4 = 0;
922 foreach (Condition condition in tc.conditions)
923 {
924 if (condition.Type == ConditionType.Debuff)
925 {
926 num4++;
927 }
928 }
929 num = num4 * 15;
930 break;
931 }
932 }
933 if (s.target == "Neighbor")
934 {
935 if (dist > 1)
936 {
937 continue;
938 }
939 num += 10;
940 }
941 if (s.proc.Length != 0 && s.proc[0] == "Debuff" && tc.HasCondition(s.proc[1]))
942 {
943 continue;
944 }
945 if (s.abilityType.Length > 1)
946 {
947 num += (owner.IsPC ? s.abilityType[2] : s.abilityType[1]).ToInt();
948 }
949 if (act is Spell)
950 {
951 if (owner.IsPC)
952 {
953 if (act.vPotential <= 0 && !owner.ability.Has(act.id))
954 {
955 continue;
956 }
957 if (flag2 || isConfused || flag4)
958 {
959 num -= 50;
960 }
961 }
962 else
963 {
964 if (flag2)
965 {
966 num -= 30;
967 }
968 if (isConfused || flag4)
969 {
970 num -= 10;
971 }
972 }
973 }
974 if (num > 0)
975 {
976 num += ability.priorityMod + EClass.rnd(tactics.RandomFacotr + ability.priorityMod);
977 }
978 ability.priority = num;
979 int HealFactor(Chara c)
980 {
981 if (isHOT && c.HasCondition(s.proc[1]))
982 {
983 return 0;
984 }
985 float num8 = (float)c.hp / (float)c.MaxHP;
986 if (num8 > (isHOT ? 0.85f : 0.75f))
987 {
988 return 0;
989 }
990 int num9 = tactics.P_Heal - (int)((float)tactics.P_Heal * num8) + (isHOT ? 50 : 25);
991 foreach (Condition condition2 in c.conditions)
992 {
993 if (condition2 is ConFear)
994 {
995 num9 += 10;
996 }
997 else if (condition2 is ConPoison)
998 {
999 num9 += 2;
1000 }
1001 else if (condition2 is ConConfuse)
1002 {
1003 num9 += 4;
1004 }
1005 else if (condition2 is ConDim)
1006 {
1007 num9 += 6;
1008 }
1009 else if (condition2 is ConBleed)
1010 {
1011 num9 += 8;
1012 }
1013 }
1014 return num9;
1015 }
1016 }
1017 abilities.Sort((ItemAbility a, ItemAbility b) => b.priority - a.priority);
1018 foreach (ItemAbility ability2 in abilities)
1019 {
1020 if (ability2.priority <= 0)
1021 {
1022 continue;
1023 }
1025 {
1026 Debug.Log(ability2.act.Name + "/" + ability2.priority + "/" + ability2.act.CanPerform(owner, ability2.tg ?? tc));
1027 }
1028 if (ability2.act.source.alias == "ActRanged")
1029 {
1030 if (TryThrow(dist))
1031 {
1032 return true;
1033 }
1034 if (TryUseRanged(dist))
1035 {
1036 return true;
1037 }
1038 continue;
1039 }
1040 Cost cost = ability2.act.GetCost(owner);
1041 if (owner.IsPCParty && ability2.pt && !ability2.act.IsTargetHostileParty() && !ability2.act.TargetType.ForceParty && cost.cost * EClass.pc.party.members.Count > owner.mana.value)
1042 {
1043 continue;
1044 }
1045 if (isPCFaction && cost.cost > 0)
1046 {
1047 switch (cost.type)
1048 {
1049 case CostType.MP:
1050 if (cost.cost > owner.mana.value)
1051 {
1052 continue;
1053 }
1054 break;
1055 case CostType.SP:
1056 if (cost.cost > owner.stamina.value)
1057 {
1058 continue;
1059 }
1060 break;
1061 }
1062 }
1063 if (cost.cost > 0 && EClass.rnd(100) > tactics.AbilityChance)
1064 {
1065 continue;
1066 }
1067 Chara chara = owner;
1068 if (ability2.act.CanPerform(owner, ability2.tg ?? tc) && owner.UseAbility(ability2.act, ability2.tg ?? tc, null, (ability2.act.HaveLongPressAction && ability2.pt) || ability2.aiPt))
1069 {
1071 {
1072 Debug.Log("Used Ability: " + chara?.ToString() + "/" + ability2.act?.ToString() + "/" + ability2.tg?.ToString() + "/" + tc);
1073 Debug.Log(ability2.act.CanPerform(chara, ability2.tg ?? tc));
1074 }
1075 return true;
1076 }
1077 }
1079 {
1080 if (tc.pos.HasBridge)
1081 {
1082 EClass._map.SetBridge(tc.pos.x, tc.pos.z, 0, 0, 0, 0, 0);
1083 }
1084 else
1085 {
1086 EClass._map.SetBridge(owner.pos.x, owner.pos.z, 0, 0, 0, 0, 0);
1087 }
1088 }
1090 {
1091 Debug.Log(owner.Name + "/" + abilities.Count);
1092 foreach (ItemAbility ability3 in abilities)
1093 {
1094 Debug.Log(ability3.act.Name + "/" + ability3.priority + "/" + ability3.act.CanPerform(owner, ability3.tg ?? tc));
1095 }
1096 }
1097 return false;
1098 void BuildCharaList()
1099 {
1100 if (charaBuilt)
1101 {
1102 return;
1103 }
1104 charas.Clear();
1105 charaBuilt = true;
1106 int sightRadius = owner.GetSightRadius();
1107 foreach (Chara chara2 in EClass._map.charas)
1108 {
1109 if (chara2 != owner)
1110 {
1111 int num12 = owner.Dist(chara2);
1112 if (num12 > sightRadius || !owner.CanSeeLos(chara2, num12))
1113 {
1114 continue;
1115 }
1116 }
1117 charas.Add(chara2);
1118 }
1119 }
1120 int ForeachChara(ItemAbility a, Func<Chara, int> func, bool isFriendlyAbility)
1121 {
1122 if (a.act.TargetType.Range == TargetRange.Self)
1123 {
1124 a.tg = owner;
1125 return func(owner);
1126 }
1127 BuildCharaList();
1128 int num6 = 0;
1129 foreach (Chara chara3 in charas)
1130 {
1131 int num7 = func(chara3);
1132 if (num7 > 0)
1133 {
1134 if (isFriendlyAbility)
1135 {
1136 if (owner.IsPCParty)
1137 {
1138 if (!chara3.IsPCParty)
1139 {
1140 continue;
1141 }
1142 }
1143 else if (!owner.IsFriendOrAbove(chara3))
1144 {
1145 continue;
1146 }
1147 if (chara3 != owner)
1148 {
1149 num7 += tactics.P_Party;
1150 }
1151 }
1152 else if (!owner.IsHostile(chara3))
1153 {
1154 continue;
1155 }
1156 if (num7 >= num6)
1157 {
1158 a.tg = chara3;
1159 num6 = num7;
1160 }
1161 }
1162 }
1163 return num6;
1164 }
1165 int GetAttackMod(Act a)
1166 {
1167 if (!owner.IsPCParty || a.source.aliasRef.IsEmpty())
1168 {
1169 return 0;
1170 }
1171 int num10 = ((a.source.aliasRef == "mold") ? owner.MainElement.id : EClass.sources.elements.alias[a.source.aliasRef].id);
1172 int num11 = -15 * tc.ResistLvFrom(num10);
1173 if (a is ActSword)
1174 {
1175 num11 = 0;
1176 }
1177 if (owner.HasElement(1238) && num11 < -15)
1178 {
1179 num11 = -15;
1180 }
1181 switch (num10)
1182 {
1183 case 910:
1184 if (tc.isWet)
1185 {
1186 num11 -= 30;
1187 }
1188 break;
1189 case 911:
1190 if (tc.HasCondition<ConBurning>())
1191 {
1192 num11 -= 30;
1193 }
1194 break;
1195 case 912:
1196 if (tc.isWet)
1197 {
1198 num11 += 30;
1199 }
1200 break;
1201 }
1202 return num11;
1203 }
1204 void GetNumEnemy(int radius)
1205 {
1206 if (numEnemy != -1)
1207 {
1208 return;
1209 }
1210 BuildCharaList();
1211 numEnemy = 0;
1212 foreach (Chara chara4 in charas)
1213 {
1214 if (chara4.host == null && owner.IsHostile(chara4) && owner.Dist(chara4) < radius && owner.CanSeeLos(chara4))
1215 {
1216 numEnemy++;
1217 }
1218 }
1219 }
1220 int GetNumNeutral(int radius)
1221 {
1222 if (numNeutral != -1)
1223 {
1224 return numNeutral;
1225 }
1226 BuildCharaList();
1227 numNeutral = 0;
1228 foreach (Chara chara5 in charas)
1229 {
1230 if (!chara5.IsPCFactionOrMinion && chara5.IsNeutralOrAbove() && owner.Dist(chara5) <= radius && owner.CanSeeLos(chara5))
1231 {
1232 numNeutral++;
1233 }
1234 }
1235 return numNeutral;
1236 }
1237 }
ConditionType
Definition: ConditionType.cs:2
TargetRange
Definition: TargetRange.cs:2
static Act Create(int id)
Definition: ACT.cs:36
override string ToString()
Definition: AIAct.cs:124
CostType
Definition: ACT.cs:64
virtual ConditionType Type
Definition: BaseStats.cs:33
bool IsRestrainedResident
Definition: Card.cs:2328
bool HasTag(CTAG tag)
Definition: Card.cs:2728
Trait trait
Definition: Card.cs:54
int Evalue(int ele)
Definition: Card.cs:2704
int GetInt(string id, int? defaultInt=null)
Definition: Card.cs:2567
int ResistLvFrom(int ele)
Definition: Card.cs:6361
bool Has(int id)
int GetMeleeDistance()
Definition: CharaBody.cs:466
override bool IsAliveInCurrentZone
Definition: Chara.cs:567
BaseCondition GetCondition(string idCon)
Definition: Chara.cs:10025
Element MainElement
Definition: Chara.cs:735
CharaBody body
Definition: Chara.cs:94
Element GetBuffStats(string alias)
Definition: Chara.cs:9982
bool isWet
Definition: Chara.cs:144
Chara GetNearbyCatToSniff()
Definition: Chara.cs:8557
Party party
Definition: Chara.cs:43
bool CanDestroyPath()
Definition: Chara.cs:2643
List< Condition > conditions
Definition: Chara.cs:215
int CountDebuff()
Definition: Chara.cs:9999
int MaxSummon
Definition: Chara.cs:732
bool IsFriendOrAbove()
Definition: Chara.cs:6969
override int MaxHP
Definition: Chara.cs:726
Thing ranged
Definition: Chara.cs:98
Stats mana
Definition: Chara.cs:1213
Stats stamina
Definition: Chara.cs:1205
bool UseAbility(int idAct, Card tc=null, Point pos=null, bool pt=false)
Definition: Chara.cs:6105
bool CanInteractTo(Card c)
Definition: Chara.cs:2750
bool IsHostile()
Definition: Chara.cs:6873
bool isConfused
Definition: Chara.cs:128
SourceRace.Row race
Definition: Chara.cs:468
Definition: ConDim.cs:2
Definition: ConHOT.cs:4
int GetRaw(int offsetHours=0)
Definition: Date.cs:328
static World world
Definition: EClass.cs:41
static SourceManager sources
Definition: EClass.cs:43
SourceElement.Row source
Definition: ELEMENT.cs:282
int vPotential
Definition: ELEMENT.cs:265
bool HasTag(string tag)
Definition: ELEMENT.cs:482
virtual int GetPower(Card c)
Definition: ELEMENT.cs:1101
int Value
Definition: ELEMENT.cs:301
virtual bool TryUseRanged(int dist)
Definition: GoalCombat.cs:486
virtual bool TryThrow(int dist)
Definition: GoalCombat.cs:495
List< Chara > charas
Definition: GoalCombat.cs:36
void SetBridge(int x, int z, int height=0, int idMat=0, int idBridge=0, int dir=0, byte idPillar=0)
Definition: Map.cs:994
List< Chara > members
Definition: Party.cs:19
int lastEmptyAlly
Definition: Player.cs:1263
bool HasBridge
Definition: Point.cs:221
bool IsBlocked
Definition: Point.cs:363
string[] abilityType
SourceElement elements
Definition: SPELL.cs:670
virtual int value
Definition: Stats.cs:56
virtual int max
Definition: Stats.cs:68
int RandomFacotr
Definition: Tactics.cs:12
int P_Party
Definition: Tactics.cs:71
int P_Spell
Definition: Tactics.cs:79
bool CastPartyBuff
Definition: Tactics.cs:88
int P_Debuff
Definition: Tactics.cs:83
int P_Buff
Definition: Tactics.cs:81
int P_Melee
Definition: Tactics.cs:73
int RangedChance
Definition: Tactics.cs:116
int AbilityChance
Definition: Tactics.cs:100
int P_Range
Definition: Tactics.cs:75
int P_Summon
Definition: Tactics.cs:85
GameDate date
Definition: World.cs:6
int CountMinions(Chara c)
Definition: Zone.cs:3949
bool HasField(int idEle)
Definition: Zone.cs:3090
virtual bool IsTown
Definition: Zone.cs:227
bool IsPCFaction
Definition: Zone.cs:477

References EClass._map, EClass._zone, abilities, Chara.ability, Tactics.AbilityChance, SourceElement.Row.abilityType, Element.act, GoalCombat.ItemAbility.act, GoalCombat.ItemAbility.aiPt, Chara.body, Chara.CanDestroyPath(), Chara.CanInteractTo(), Act.CanPerform(), Chara.CanSeeLos(), Tactics.CastPartyBuff, charas, Map.charas, Chara.conditions, Act.Cost.cost, Chara.CountDebuff(), Zone.CountMinions(), ACT.Create(), World.date, EClass.debug, Debug, Card.Dist(), SourceManager.elements, Card.Evalue(), TargetType.ForceParty, Chara.GetBuffStats(), Chara.GetCondition(), Element.GetCost(), Card.GetInt(), CharaBody.GetMeleeDistance(), Chara.GetNearbyCatToSniff(), Element.GetPower(), Date.GetRaw(), Card.GetSightRadius(), CharaAbility.Has(), Point.HasBridge, Chara.HasCondition(), Card.HasElement(), Zone.HasField(), Card.HasTag(), Element.HasTag(), Act.HaveLongPressAction, Chara.host, Card.hp, Card.id, Element.id, Chara.IsAliveInCurrentZone, Chara.isBerserk, Chara.isBlind, Point.IsBlocked, Chara.isConfused, Chara.IsFriendOrAbove(), Chara.IsHostile(), Chara.IsNeutralOrAbove(), Chara.IsPC, Chara.IsPCFaction, Zone.IsPCFaction, Card.IsPCFactionOrMinion, Chara.IsPCParty, Card.isRestrained, Card.IsRestrainedResident, Act.IsTargetHostileParty(), Zone.IsTown, Chara.isWet, Player.lastEmptyAlly, CoreDebug.logCombat, Chara.MainElement, Chara.mana, Stats.max, Chara.MaxHP, Chara.MaxSummon, Party.members, Card.Name, Element.Name, AIAct.owner, Tactics.P_Buff, Tactics.P_Debuff, Tactics.P_Melee, Tactics.P_Party, Tactics.P_Range, Tactics.P_Spell, Tactics.P_Summon, Chara.party, EClass.pc, EClass.player, Card.pos, BaseCondition.power, GoalCombat.ItemAbility.priority, GoalCombat.ItemAbility.priorityMod, SourceElement.Row.proc, GoalCombat.ItemAbility.pt, Chara.race, Tactics.RandomFacotr, TargetType.Range, Chara.ranged, Tactics.RangedChance, Card.ResistLvFrom(), EClass.rnd(), Map.SetBridge(), Element.source, Tactics.source, EClass.sources, Chara.stamina, tactics, SourceElement.Row.target, Act.TargetType, tc, GoalCombat.ItemAbility.tg, AIAct.ToString(), Chara.ToString(), Card.trait, TryThrow(), TryUseRanged(), Act.Cost.type, BaseStats.Type, Chara.UseAbility(), Element.Value, Stats.value, Element.vPotential, EClass.world, Point.x, and Point.z.

Referenced by Run().

◆ TryUseRanged()

virtual bool GoalCombat.TryUseRanged ( int  dist)
inlinevirtual

Reimplemented in GoalAutoCombat.

Definition at line 486 of file GoalCombat.cs.

487 {
488 if (owner.TryEquipRanged())
489 {
490 return ACT.Ranged.Perform(owner, tc);
491 }
492 return false;
493 }
override bool Perform()
Definition: ActRanged.cs:65

References AIAct.owner, ActRanged.Perform(), ACT.Ranged, tc, and Chara.TryEquipRanged().

Referenced by TryUseAbility().

Member Data Documentation

◆ abilities

List<ItemAbility> GoalCombat.abilities

◆ charas

List<Chara> GoalCombat.charas = new List<Chara>()

Definition at line 36 of file GoalCombat.cs.

Referenced by TryUseAbility().

◆ destEnemy

Chara GoalCombat.destEnemy

Definition at line 26 of file GoalCombat.cs.

Referenced by GoalAutoCombat.GoalAutoCombat(), and Run().

◆ idleCount

int GoalCombat.idleCount

Definition at line 30 of file GoalCombat.cs.

Referenced by Run().

◆ moveFail

int GoalCombat.moveFail

Definition at line 32 of file GoalCombat.cs.

Referenced by TryMove().

◆ tc

Chara GoalCombat.tc

Property Documentation

◆ CancelOnAggro

override bool GoalCombat.CancelOnAggro
get

Definition at line 42 of file GoalCombat.cs.

◆ CancelWhenDamaged

override bool GoalCombat.CancelWhenDamaged
get

Definition at line 40 of file GoalCombat.cs.

◆ CursorIcon

override CursorInfo GoalCombat.CursorIcon
get

Definition at line 38 of file GoalCombat.cs.

◆ tactics

Tactics GoalCombat.tactics
get

Definition at line 44 of file GoalCombat.cs.

Referenced by Run(), TryMove(), and TryUseAbility().


The documentation for this class was generated from the following file: