diff --git a/reactivedrop/fgd/swarm.fgd b/reactivedrop/fgd/swarm.fgd index 831eda18d..b2e70f10c 100644 --- a/reactivedrop/fgd/swarm.fgd +++ b/reactivedrop/fgd/swarm.fgd @@ -314,6 +314,8 @@ 3 : "Bait" 4 : "Neutral" 5 : "Combine" + 6 : "Robots" + 7 : "Incapacitated" ] damagemultipliersamefaction(float) : "Same Faction Damage Scale" : "1.0" : "Amount to scale damage by when attacked by the faction the bullseye is a member of." damagemultiplierotherfaction(float) : "Different Faction Damage Scale" : "1.0" : "Amount to scale damage by when attacked by a faction the bullseye is NOT a member of." diff --git a/src/game/server/swarm/asw_marine.cpp b/src/game/server/swarm/asw_marine.cpp index 0a2ceb354..9deb31f09 100644 --- a/src/game/server/swarm/asw_marine.cpp +++ b/src/game/server/swarm/asw_marine.cpp @@ -4781,7 +4781,7 @@ void CASW_Marine::SetKnockedOut(bool bKnockedOut) // reactivedrop: setting it to no solid still collides it with aliens // will try changing collision group SetCollisionGroup( ASW_COLLISION_GROUP_BOTS ); - ChangeFaction( FACTION_NEUTRAL ); + ChangeFaction( FACTION_INCAPACITATED ); CTakeDamageInfo info; info.SetDamageType( DMG_GENERIC ); info.SetDamageForce( vec3_origin ); diff --git a/src/game/shared/gamerules.h b/src/game/shared/gamerules.h index 1a555c550..caea36d18 100644 --- a/src/game/shared/gamerules.h +++ b/src/game/shared/gamerules.h @@ -316,7 +316,7 @@ abstract_class CGameRules : public CMemZeroOnNew, public CAutoGameSystemPerFrame virtual void InitDefaultAIRelationships( void ) { return; } virtual const char* AIClassText(int classType) { return NULL; } virtual int NumEntityClasses() const { return LAST_SHARED_ENTITY_CLASS; } - virtual int NumFactions() const { return LAST_SHARED_FACTION; } + virtual int NumFactions() const { return NUM_SHARED_FACTIONS; } // Healthcharger respawn control virtual float FlHealthChargerRechargeTime( void ) = 0;// how long until a depleted HealthCharger recharges itself? diff --git a/src/game/shared/shareddefs.h b/src/game/shared/shareddefs.h index c3c321a0c..6fd250710 100644 --- a/src/game/shared/shareddefs.h +++ b/src/game/shared/shareddefs.h @@ -898,8 +898,11 @@ enum Class_T }; // Factions -#define FACTION_NONE 0 // Not assigned a faction. Entities not assigned a faction will not do faction tests. -#define LAST_SHARED_FACTION (FACTION_NONE) -#define NUM_SHARED_FACTIONS (FACTION_NONE + 1) +enum +{ + FACTION_NONE = 0, // Not assigned a faction. Entities not assigned a faction will not do faction tests. + + NUM_SHARED_FACTIONS, +}; #endif // SHAREDDEFS_H diff --git a/src/game/shared/swarm/asw_gamerules.cpp b/src/game/shared/swarm/asw_gamerules.cpp index cf1d4cde9..d3e2cebe5 100644 --- a/src/game/shared/swarm/asw_gamerules.cpp +++ b/src/game/shared/swarm/asw_gamerules.cpp @@ -4604,40 +4604,54 @@ void CAlienSwarm::InitDefaultAIRelationships() CBaseCombatCharacter::AllocateDefaultRelationships(); // set up faction relationships - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_MARINES, FACTION_ALIENS, D_HATE, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_MARINES, FACTION_MARINES, D_LIKE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_MARINES, FACTION_ALIENS, D_HATE, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_MARINES, FACTION_BAIT, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_MARINES, FACTION_NEUTRAL, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_MARINES, FACTION_COMBINE, D_HATE, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_MARINES, FACTION_ROBOTS, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_MARINES, FACTION_INCAPACITATED, D_LIKE, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ALIENS, FACTION_ALIENS, D_LIKE, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ALIENS, FACTION_MARINES, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ALIENS, FACTION_ALIENS, D_LIKE, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ALIENS, FACTION_BAIT, D_HATE, 999 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ALIENS, FACTION_NEUTRAL, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ALIENS, FACTION_COMBINE, D_HATE, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ALIENS, FACTION_ROBOTS, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ALIENS, FACTION_INCAPACITATED, D_NEUTRAL, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_NEUTRAL, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_MARINES, D_NEUTRAL, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_BAIT, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_ALIENS, D_NEUTRAL, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_BAIT, D_NEUTRAL, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_NEUTRAL, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_COMBINE, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_ROBOTS, D_NEUTRAL, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_NEUTRAL, FACTION_INCAPACITATED, D_NEUTRAL, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_COMBINE, D_LIKE, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_NEUTRAL, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_MARINES, D_HATE, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_BAIT, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_ALIENS, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_BAIT, D_NEUTRAL, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_NEUTRAL, D_NEUTRAL, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_COMBINE, D_LIKE, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_ROBOTS, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_COMBINE, FACTION_INCAPACITATED, D_NEUTRAL, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_ROBOTS, D_LIKE, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_NEUTRAL, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_MARINES, D_HATE, 0 ); - CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_BAIT, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_ALIENS, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_BAIT, D_NEUTRAL, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_NEUTRAL, D_NEUTRAL, 0 ); CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_COMBINE, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_ROBOTS, D_LIKE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_ROBOTS, FACTION_INCAPACITATED, D_NEUTRAL, 0 ); + + // Just like Marines. But Hostiles should be neutral towards undead marines or else they will crowd dead bodies when `rd_allow_revive 1` + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_INCAPACITATED, FACTION_MARINES, D_LIKE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_INCAPACITATED, FACTION_ALIENS, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_INCAPACITATED, FACTION_BAIT, D_NEUTRAL, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_INCAPACITATED, FACTION_NEUTRAL, D_NEUTRAL, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_INCAPACITATED, FACTION_COMBINE, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_INCAPACITATED, FACTION_ROBOTS, D_HATE, 0 ); + CAI_BaseNPC::SetDefaultFactionRelationship(FACTION_INCAPACITATED, FACTION_INCAPACITATED, D_LIKE, 0 ); // Matching HL2 defaults: Wildlife is scared of everything except other wildlife, barnacles (if we ever add them), and invisible NPCs. for ( int nClass = CLASS_NONE; nClass < LAST_ASW_ENTITY_CLASS; nClass++ ) diff --git a/src/game/shared/swarm/asw_gamerules.h b/src/game/shared/swarm/asw_gamerules.h index 445ee8001..5131532d7 100644 --- a/src/game/shared/swarm/asw_gamerules.h +++ b/src/game/shared/swarm/asw_gamerules.h @@ -88,14 +88,18 @@ class CASW_Powerup; class CBaseStart; // Faction defines -#define FACTION_MARINES ( LAST_SHARED_FACTION + 1 ) -#define FACTION_ALIENS ( LAST_SHARED_FACTION + 2 ) -#define FACTION_BAIT ( LAST_SHARED_FACTION + 3 ) -#define FACTION_NEUTRAL ( LAST_SHARED_FACTION + 4 ) -#define FACTION_COMBINE ( LAST_SHARED_FACTION + 5 ) -#define FACTION_ROBOTS ( LAST_SHARED_FACTION + 6 ) -#define LAST_ASW_FACTION (FACTION_ROBOTS) -#define NUM_ASW_FACTIONS (LAST_ASW_FACTION + 1) +enum +{ + FACTION_MARINES = NUM_SHARED_FACTIONS, + FACTION_ALIENS, + FACTION_BAIT, + FACTION_NEUTRAL, + FACTION_COMBINE, + FACTION_ROBOTS, + FACTION_INCAPACITATED, + + NUM_ASW_FACTIONS, +}; struct StringKeyValue_t {