Skip to content

Commit c6d002c

Browse files
committed
Several things. --- 1: Fixed generic scripts. Each team gets its own copy and only just the prototype and with it the first instance. They now respect delay seconds and isActive(). --- 2: Creation of a vision system that marks units as being seen when an enemy unit's shroudRevealRange encapsulates it. Seen units are 'saved' as such for 300 frames by a new partitionFilter. --- 3: Creation of a partitionFilter for objectTypes that takes a vector of ThingTemplates. Scripts will pass on such vector for a much faster getClosestObject(). --- 4: Implementation of a health tracking system for teams. m_maxHealth stores what should be 100% of the team's health while m_ghostHealth stores the hp values of team teammembers. Humvess can now unload when below N% health and teams can now retreat this way as well. --- 5: More scripts all around
1 parent f2f8394 commit c6d002c

21 files changed

Lines changed: 3631 additions & 373 deletions

File tree

GeneralsMD/Code/GameEngine/Include/Common/Player.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,8 @@ class Player : public Snapshot
456456
void buildBySuppliesAngle(Int minimumCash, const AsciiString& thingName, Real angle);
457457
void buildSpecificBuildingNearestTeamAngle(const AsciiString& thingName, const Team* team, Real angle);
458458
void buildSpecificBuildingNearestObjectAngle(const AsciiString& thingName, const Object* bestObj, Real angle);
459+
void updateLastFrameSeen();
460+
void countObjectsByThingTemplateArea(Int numTmplates, const ThingTemplate* const* things, Bool ignoreDead, Int* counts, Bool ignoreUnderConstruction, const PolygonTrigger* triggerArea) const;
459461
//-------------------------------------------------------------------------------------------------
460462
//--------------------------------- @CLP_AI PLAYER ADDITIONS END ----------------------------------
461463
//-------------------------------------------------------------------------------------------------

GeneralsMD/Code/GameEngine/Include/Common/Team.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ typedef struct {
115115
AsciiString unitThingName;
116116
} TCreateUnitsInfo;
117117

118-
enum { MAX_GENERIC_SCRIPTS = 32 };
118+
enum { MAX_GENERIC_SCRIPTS = 64 };
119119

120120
// ------------------------------------------------------------------------
121121
/// This is the info for creating reinforcement and AI teams.
@@ -352,6 +352,17 @@ class Team : public MemoryPoolObject,
352352
std::vector<const ThingTemplate*> m_lastFrameDeaths;
353353
Bool m_lostUnitThisFrame;
354354

355+
void countObjectsByThingTemplateArea(Int numTmplates, const ThingTemplate* const* things, Bool ignoreDead, Int* counts, Bool ignoreUnderConstruction, const PolygonTrigger* triggerArea) const;
356+
Script* m_genericScriptsToRun[MAX_GENERIC_SCRIPTS]; // @-TanSo-: Every team instance should be able to get its own set of generic scripts, and not only the first!
357+
358+
Int m_ownedUnits; // Much like m_curUnits, but we update it regardless of a script being present in "On % destroyed".
359+
Real m_maxHealth; // Adds max Health of alive and dead units. Only updates if the unit count changed. Used to measure strength loss of a team later on after units potentially died. Counts 'obj->getBodyModule->getMaxHealth();'.
360+
Real m_ghostHealth; // Save max health of our dead team members so we can add them back in m_maxHealth.
361+
Real getCurrentHealth();
362+
void updateHealth();
363+
364+
Int m_idleFrames; // How long has our team been idling for?
365+
355366
//-------------------------------------------------------------------------------------------------
356367
//---------------------------------- @CLP_AI TEAM ADDITIONS END -----------------------------------
357368
//-------------------------------------------------------------------------------------------------
@@ -641,6 +652,8 @@ class TeamPrototype : public MemoryPoolObject,
641652
void setAttackPriorityName(const AsciiString &name) { m_attackPriorityName = name;}
642653
AsciiString getAttackPriorityName() const { return m_attackPriorityName;}
643654

655+
void countObjectsByThingTemplateArea(Int numTmplates, const ThingTemplate* const* things, Bool ignoreDead, Int* counts, Bool ignoreUnderConstruction, const PolygonTrigger* triggerArea) const;
656+
644657
protected:
645658

646659
// snapshot methods

GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,9 @@ class Object : public Thing, public Snapshot
640640
Bool isBeingCaptured() const { return m_isBeingCaptured; }
641641
void setIsBeingCaptured(Bool beingCaptured);
642642

643+
Bool m_seenByEnemy; // @-TanSo-: use this with our scripts so we can make AI attack only things it sees at this moment. Pretty fair, right?
644+
Int m_lastSeenFrame;
645+
643646
protected:
644647

645648
void setOrRestoreTeam( Team* team, Bool restoring );

GeneralsMD/Code/GameEngine/Include/GameLogic/PartitionManager.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,6 +1223,42 @@ class PartitionFilterValidCommandButtonTarget : public PartitionFilter
12231223
#endif
12241224
};
12251225

1226+
//=====================================
1227+
/**
1228+
* @ -TanSo: Accept all objects with m_seenByEnemy = true
1229+
*/
1230+
class PartitionFilterLastFrameSeen : public PartitionFilter
1231+
{
1232+
private:
1233+
Player* m_player;
1234+
Bool m_match;
1235+
public:
1236+
PartitionFilterLastFrameSeen(Player* player, Bool match) : m_player(player), m_match(match) {}
1237+
protected:
1238+
virtual Bool allow(Object* other);
1239+
#if defined(RTS_DEBUG)
1240+
virtual const char* debugGetName() { return "PartitionFilterLastFrameSeen"; }
1241+
#endif
1242+
};
1243+
1244+
//=====================================
1245+
/**
1246+
* @ -TanSo: Accept all defined object types
1247+
*/
1248+
class PartitionFilterObjectTypes : public PartitionFilter
1249+
{
1250+
private:
1251+
std::vector<const ThingTemplate*> m_templates;
1252+
Bool m_match;
1253+
public:
1254+
PartitionFilterObjectTypes(const std::vector<const ThingTemplate*>& acceptedTemplates, Bool match) : m_templates(acceptedTemplates), m_match(match) {}
1255+
protected:
1256+
virtual Bool allow(Object* other);
1257+
#if defined(RTS_DEBUG)
1258+
virtual const char* debugGetName() { return "PartitionFilterObjectTypes"; }
1259+
#endif
1260+
};
1261+
12261262
//=====================================
12271263
/**
12281264
PartitionManager is the singleton class that manages the entire partition/collision

GeneralsMD/Code/GameEngine/Include/GameLogic/ScriptActions.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -458,8 +458,26 @@ class ScriptActions : public ScriptActionsInterface
458458
void doAIPlayerAddBaseDefenseStructure(const AsciiString& objectType);
459459
void doAIPlayerRemoveBaseDefenseStructure(const AsciiString& objectType);
460460

461-
462-
// @-TanSo-: 58 additions
461+
void doTeamAttackType(const AsciiString& teamName, const AsciiString& objectType);
462+
void doTeamAttackTypeArea(const AsciiString& teamName, const AsciiString& objectType, const AsciiString& pTriggerParm);
463+
void doTeamAttackSeenUnit(const AsciiString& teamName);
464+
void doTeamAttackSeenType(const AsciiString& teamName, const AsciiString& objectType);
465+
void doTeamAttackSeenArea(const AsciiString& teamName, const AsciiString& pTriggerParm);
466+
void doTeamAttackSeenTypeArea(const AsciiString& teamName, const AsciiString& objectType, const AsciiString& pTriggerParm);
467+
468+
void doTeamAttackMoveLocation(const AsciiString& teamName, const AsciiString& waypointName);
469+
void doTeamAttackMoveArea(const AsciiString& teamName, const AsciiString& pTriggerArea);
470+
void doTeamAttackMoveType(const AsciiString& teamName, const AsciiString& objectType);
471+
void doTeamAttackMoveTypeArea(const AsciiString& teamName, const AsciiString& objectType, const AsciiString& pTriggerArea);
472+
void doTeamAttackMoveSeenUnit(const AsciiString& teamName);
473+
void doTeamAttackMoveSeenType(const AsciiString& teamName, const AsciiString& objectType);
474+
void doTeamAttackMoveSeenArea(const AsciiString& teamName, const AsciiString& pTriggerParm);
475+
void doTeamAttackMoveSeenTypeArea(const AsciiString& teamName, const AsciiString& objectType, const AsciiString& pTriggerParm);
476+
477+
void doTeamEvacuateDestroyedPercent(const AsciiString& teamName, Real value);
478+
479+
480+
// @-TanSo-: 73 additions
463481
//-------------------------------------------------------------------------------------------------
464482
//----------------------------- @CLP_AI SCRIPT ACTION ADDITIONS END -------------------------------
465483
//-------------------------------------------------------------------------------------------------

GeneralsMD/Code/GameEngine/Include/GameLogic/ScriptConditions.h

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,39 +187,74 @@ class ScriptConditions : public ScriptConditionsInterface
187187

188188
Bool evaluatePlayerRelation(const AsciiString& playerSrcName, Int relationType, const AsciiString& playerDstName);
189189
Bool evaluateEmptySpot(Parameter* pStartNdx);
190+
Bool evaluateActivePlayerCount(Parameter* pComparisonParm, Int pPlayerCount);
191+
Bool evaluateEmptySpotCount(Parameter* pComparisonParm, Int pEmptySpotCount);
190192
Bool evaluateNeighbouringSpot(Parameter* pPlayerParm, Parameter* pStartNdx);
191193
Bool evaluateNeighbouringSpotsEmpty(Parameter* pPlayerParm, Parameter* pComparisonParm, Int pCount);
192194
Bool evaluateNeighbouringSpotsRelation(Parameter* pPlayerParm, Parameter* pComparisonParm, Int pCount, Int relationType);
195+
196+
Bool evaluateMapSize(Parameter* pComparisonParm, Int pMapSize);
193197
Bool evaluateStartingCash(Parameter* pComparisonParm, Int pAmount);
198+
194199
Bool evaluateClosestRelationUnitToMySpawn(Int relationType, Parameter* pPlayerParm, Parameter* pComparisonParm, Real pDist);
200+
195201
Bool evaluateHunted(Parameter* pPlayerParm);
202+
196203
Bool evaluatePlayerLostTypeInArea(Parameter* pPlayerParm, Parameter* pObjectType, Parameter* pArea);
197204
Bool evaluatePlayerLostUnit(Parameter* pPlayerParm);
205+
198206
Bool evaluateTeamSightedRelationType(Parameter* pTeam, Int relationType, Parameter* pObjectType);
207+
199208
Bool evaluateSkirmishAnyRelationFaction(Parameter* pPlayerParm, Int relationType, Parameter* pFactionParm);
200-
Bool evaluateMapSize(Parameter* pComparisonParm, Int pMapSize);
201-
Bool evaluateActivePlayerCount(Parameter* pComparisonParm, Int pPlayerCount);
202-
Bool evaluateEmptySpotCount(Parameter* pComparisonParm, Int pEmptySpotCount);
209+
203210
Bool evaluatePlayerDestroyedEnemyType(Parameter* pPlayerParm, Parameter* pObjectType);
204211
Bool evaluatePlayerDestroyedEnemyUnit(Parameter* pPlayerParm);
205-
Bool evaluatePointControlled(Player* player, const Coord3D& point, Real radius); //@-TanSo-: helper method for evaluate(Relation)MapControl.
212+
213+
Bool evaluatePointControlled(Player* player, const Coord3D& point, Real radius); //@-TanSo-: helper method for evaluate(Relation)MapControl(Area).
206214
Bool evaluateMapControl(Parameter* pPlayerParm, Parameter* pComparisonParm, Real pValue);
207215
Bool evaluateRelationMapControl(Parameter* pPlayerParm, Int relationType, Parameter* pComparisonParm, Real pValue);
208216
Bool evaluateMapControlArea(Parameter* pPlayerParm, Parameter* pComparisonParm, Real pValue, Parameter* pTriggerParm);
209217
Bool evaluateRelationMapControlArea(Parameter* pPlayerParm, Int relationType, Parameter* pComparisonParm, Real pValue, Parameter* pTriggerParm);
218+
210219
Bool evaluateTeamLostType(Parameter* pTeamParm, Parameter* objectType);
211220
Bool evaluateTeamLostUnit(Parameter* pTeamParm);
221+
212222
Bool evaluatePlayerSightedRelationType(Parameter* pPlayerParm, Int relationType, Parameter* pObjectType);
213-
Bool evaluateRelationPlayerSightedRelationType(Parameter* pPlayerParm, Int playerRelationType, Int relationType, Parameter* pObjecType);
223+
Bool evaluateRelationPlayerSightedRelationType(Parameter* pPlayerParm, Int playerRelationType, Int relationType, Parameter* pObjectType);
224+
Bool evaluateRelationPlayerSightedRelationArea(Parameter* pPlayerParm, Int playerRelationType, Int relationType, Parameter* pTriggerParm);
225+
Bool evaluateRelationPlayerSightedRelationTypeArea(Parameter* pPlayerParm, Int playerRelationType, Int relationType, Parameter* pObjectType, Parameter* pTriggerParm);
226+
214227
Bool evaluateRelationPlayerValueArea(Condition* pCondition, Parameter* pPlayerParm, Int relationType, Parameter* pComparisonParm, Int value, Parameter* pTriggerParm);
215-
Bool evaluateRelationPlayerOwnsComparsionType(Condition* pCondition, Parameter* pPlayerParm, Int relationType, Parameter* pComparisonParm, Int value, Parameter* objectType);
228+
Bool evaluateRelationPlayerOwnsComparisonType(Condition* pCondition, Parameter* pPlayerParm, Int relationType, Parameter* pComparisonParm, Int value, Parameter* objectType);
229+
216230
Bool evaluatePlayerAttackedInArea(Parameter* pPlayerParm, Parameter* pTriggerParm);
231+
217232
Bool evaluatePlayerBuildingBeingCaptured(Parameter* pPlayerParm);
218233
Bool evaluatePlayerBuildingBeingCapturedType(Parameter* pPlayerParm, Parameter* objectType);
219234
Bool evaluatePlayerBuildingBeingCapturedArea(Parameter* pPlayerParm, Parameter* pTriggerParm);
220235
Bool evaluatePlayerBuildingBeingCapturedTypeArea(Parameter* pPlayerParm, Parameter* objectType, Parameter* pTriggerParm);
236+
221237
Bool evaluateRelationPlayerComparisonTypeArea(Condition* pCondition, Parameter* pPlayerParm, Int relationType, Parameter* pComparisonParm, Int value, Parameter* objectType, Parameter* pTriggerParm);
222-
// @-TanSo-: 33 additions, 1 helper method
238+
239+
Bool evaluateTeamIdle(Parameter* pTeamParm);
240+
Bool evaluateTeamIdleFrames(Parameter* pTeam, Int value);
241+
242+
Bool evaluatePlayerHasComparisonRatioOther(Condition* pCondition, Parameter* pPlayerParm, Parameter* pComparisonParm, Real ratio, Parameter* pOther);
243+
Bool evaluatePlayerHasComparisonRatioTypeOther(Condition* pCondition, Parameter* pPlayerParm, Parameter* pComparisonParm, Real ratio, Parameter* objectType, Parameter* pOther, Parameter* otherObjectType);
244+
Bool evaluatePlayerHasComparisonRatioAreaOther(Condition* pCondition, Parameter* pPlayerParm, Parameter* pComparisonParm, Real ratio, Parameter* pTriggerParm, Parameter* pOther);
245+
Bool evaluatePlayerHasComparisonRatioTypeAreaOther(Condition* pCondition, Parameter* pPlayerParm, Parameter* pComparisonParm, Real ratio, Parameter* objectType, Parameter* pTriggerParm, Parameter* pOther, Parameter* otherObjectType);
246+
Bool evaluateRelationPlayerHasComparisonRatioOtherRelation(Condition* pCondition, Parameter* pPlayerParm, Int pRelation, Parameter* pComparisonParm, Real ratio, Int pOtherRelation);
247+
Bool evaluateRelationPlayerHasComparisonRatioTypeOtherRelation(Condition* pCondition, Parameter* pPlayerParm, Int pRelation, Parameter* pComparisonParm, Real ratio, Parameter* objectType, Int pOtherRelation, Parameter* otherObjectType);
248+
Bool evaluateRelationPlayerHasComparisonRatioAreaOtherRelation(Condition* pCondition, Parameter* pPlayerParm, Int pRelation, Parameter* pComparisonParm, Real ratio, Parameter* pTriggerParm, Int pOtherRelation);
249+
Bool evaluateRelationPlayerHasComparisonRatioTypeAreaOtherRelation(Condition* pCondition, Parameter* pPlayerParm, Int pRelation, Parameter* pComparisonParm, Real ratio, Parameter* objectType, Parameter* pTriggerParm, Int pOtherRelation, Parameter* otherObjectType);
250+
251+
Bool evaluateTeamContainsType(Parameter* pTeamParm, Parameter* objectType);
252+
Bool evaluateTeamContainsComparisonType(Parameter* pTeamParm, Parameter* pComparisonParm, Int value, Parameter* objectType);
253+
254+
Bool evaluateTeamSingleBelowHealth(Parameter* pTeamParm, Real value);
255+
Bool evaluateTeamBelowHealth(Parameter* pTeamParm, Real value);
256+
257+
// @-TanSo-: 49 additions, 1 helper method
223258
//-------------------------------------------------------------------------------------------------
224259
//---------------------------- @CLP_AI SCRIPT CONDITION ADDITIONS END -----------------------------
225260
//-------------------------------------------------------------------------------------------------

GeneralsMD/Code/GameEngine/Include/GameLogic/ScriptEngine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,6 @@ class ScriptEngine : public SubsystemInterface,
381381
void executeScripts( Script *pScriptHead );
382382
void executeScript( Script *pScript );
383383
Script *findScript(const AsciiString& name);
384-
Script *findScript(const AsciiString& name, Team* pTeam); //@-TanSo-: make it possible to also find scripts within generic scripts
385384
ScriptGroup *findGroup(const AsciiString& name);
386385
void setSway( ScriptAction *pAction );
387386
void setCounter( ScriptAction *pAction );
@@ -435,10 +434,11 @@ class ScriptEngine : public SubsystemInterface,
435434
void setCounterRandom(ScriptAction* pAction, Bool random);
436435
Bool evaluateTwoCounters(Condition* pCondition);
437436
void copyCounter(ScriptAction* pAction);
437+
Bool evaluateCounterDivisible(Condition* pCondition);
438438

439439

440440
void setKDRatio(ScriptAction* pAction);
441-
Real allocateKDRatio(const AsciiString& name);
441+
Int allocateKDRatio(const AsciiString& name);
442442
const TKDRatio* getKDRatio(const AsciiString& counterName);
443443
Bool evaluateKDRatio(Condition* pCondition);
444444
void addKDRatioKills(ScriptAction* pAction);

GeneralsMD/Code/GameEngine/Include/GameLogic/Scripts.h

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -639,8 +639,26 @@ class ScriptAction : public MemoryPoolObject // This is the action class.
639639
PLAYER_SELL_ALL_BUILDINGS_TYPE_AREA, ///< Make an AI player sell off all buildings of a type in an area.
640640

641641
AI_PLAYER_BUILD_TYPE_NEAREST_KINDOF_ROTATED_AREA, ///< AI player builds a structure near a kindOf in an area rotated <Real> degrees.
642-
AI_PLAYER_BUILD_TYPE_NEAREST_TYPE_ROTATED_AREA, ///< AI player builds a structure near a type in an area source rotaded <Real> degrees.
643-
642+
AI_PLAYER_BUILD_TYPE_NEAREST_TYPE_ROTATED_AREA, ///< AI player builds a structure near a type in an area source rotated <Real> degrees.
643+
644+
TEAM_ATTACK_TYPE, ///< Set a team to attack units with a specific type.
645+
TEAM_ATTACK_TYPE_AREA, ///< Set a team to attack unis with a specific type in an area.
646+
TEAM_ATTACK_SEEN_UNIT, ///< Set a team to attack units the player sees.
647+
TEAM_ATTACK_SEEN_TYPE, ///< Set a team to attack units the player sees with a specific type.
648+
TEAM_ATTACK_SEEN_AREA, ///< Set a team to attack units the player sees in an area.
649+
TEAM_ATTACK_SEEN_TYPE_AREA, ///< Set a team to attack unis the player sees with a specific type in an area.
650+
651+
TEAM_ATTACKMOVE_WAYPOINT, ///< Set a team to attack move towards a waypoint.
652+
TEAM_ATTACKMOVE_TYPE, ///< Set a team to attack move towards an enemy object of a type.
653+
TEAM_ATTACKMOVE_TYPE_AREA, ///< Set a team to attack move towards an enemy object of a type in an area.
654+
655+
TEAM_EVACUATE_DESTROYED_PERCENT, ///< Set a team to evacuate all transports below N%.
656+
657+
TEAM_ATTACKMOVE_AREA, ///< Set a team to attack move towards an enemy object in an area.
658+
TEAM_ATTACKMOVE_SEEN_UNIT, ///< Set a team to attack move towards units the player sees .
659+
TEAM_ATTACKMOVE_SEEN_TYPE, ///< Set a team to attack move towards units of a type the player sees.
660+
TEAM_ATTACKMOVE_SEEN_AREA, ///< Set a team to attack move towards units in an area the player sees.
661+
TEAM_ATTACKMOVE_SEEN_TYPE_AREA, ///< Set a team to attack move towards units of a type in an area the player sees.
644662
//-------------------------------------------------------------------------------------------------
645663
//--------------------------- @CLP_AI SCRIPT ACTIONS ADDITIONS END --------------------------------
646664
//-------------------------------------------------------------------------------------------------
@@ -1140,6 +1158,30 @@ class Condition : public MemoryPoolObject // This is the conditional class.
11401158
PLAYER_BUILDING_BEING_CAPTURED_TYPE_AREA,// True if a player's building of a type in an area is being captured by an enemy.
11411159

11421160
RELATION_PLAYER_COMPARISON_TYPE_AREA,// True if all of player's <relation> co-players combined have <comparison> <int> <type> in an area.
1161+
1162+
PLAYER_COMPARISON_RATIO_OTHER, // True if player A has <comparison> <Real> times as many units as player B.
1163+
PLAYER_COMPARISON_RATIO_TYPE_OTHER, // True if player A has <comparison> <Real> times as many units of a type as player B.
1164+
PLAYER_COMPARISON_RATIO_AREA_OTHER, // True if player A has <comparison> <Real> times as many units in an area as player B.
1165+
PLAYER_COMPARISON_RATIO_TYPE_AREA_OTHER,// True if player A has <comparison> <Real> times as many units of a type in an area than player B.
1166+
RELATION_PLAYER_COMPARISON_RATIO_OTHER_RELATION,// True if all of player A's <relation> co-players combined have <comparison> <Real> times as many units as player B's co-players.
1167+
RELATION_PLAYER_COMPARISON_RATIO_TYPE_OTHER_RELATION,// True if all of player A's <relation> co-players combined have <comparison> <Real> times as many units of a type as player B's co-players.
1168+
RELATION_PLAYER_COMPARISON_RATIO_AREA_OTHER_RELATION,// True if all of player A's <relation> co-players combined have <comparison> <Real> times as many units in an area as player B's co-players.
1169+
RELATION_PLAYER_COMPARISON_RATIO_TYPE_AREA_OTHER_RELATION, // True if all of player A's <relation> co-players combined have <comparison> <Real> times as many units of a type in an area as Player B's co-players.
1170+
1171+
RELATION_PLAYER_SIGHTED_RELATION_AREA, // True if one of a player's <relation> co-players has sighted a <relation> unit in an area.
1172+
RELATION_PLAYER_SIGHTED_RELATION_TYPE_AREA,// True if one of a player's <relation> co-players has sighted a <relation> unit of type in an area.
1173+
1174+
TEAM_IDLE, // True if a team is idling.
1175+
1176+
TEAM_CONTAINS_TYPE, // True if a team contains an object of a type.
1177+
TEAM_CONTAINS_COMPARISON_TYPE, // True if a team contains <comparison> <int> objects of a type.
1178+
1179+
COUNTER_DIVISIBLE, // True if a counter is divisible by <int>.
1180+
TEAM_SINGLE_BELOW_HEALTH, // True if a single member of a team drops below <real> % health.
1181+
TEAM_BELOW_HEALTH, // True if the entire team drops below <real> & health.
1182+
1183+
TEAM_IDLE_FRAMES, // True if a team has been idling for at least the past <int> frames.
1184+
11431185
//-------------------------------------------------------------------------------------------------
11441186
//---------------------------- @CLP_AI SCRIPT CONDITION ADDITIONS END -----------------------------
11451187
//-------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)