Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion GeneralsMD/Code/GameEngine/Include/Common/ActionManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ class ActionManager : public SubsystemInterface
Bool canPlayerGarrison( const Player *player, const Object *target, CommandSourceType commandSource );

protected:

//used to assign behaviour types for new special power enums
SpecialPowerType getFallbackBehaviorType(SpecialPowerType type);
};

// EXTERNALS //////////////////////////////////////////////////////////////////////////////////////
Expand Down
77 changes: 76 additions & 1 deletion GeneralsMD/Code/GameEngine/Include/Common/SpecialPowerType.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,9 @@ enum SpecialPowerType CPP_11(: Int)
SPECIAL_BATTLESHIP_BOMBARDMENT,

//new constants by OFS
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// NEW CONSTANTS NEED A BEHAVIORTYPE DEFINED IN THE SPECIALPOWER OR return one in getFallbackBehaviorType in ActionManager.cpp
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SPECIAL_ION_CANNON,
SPECIAL_CLUSTER_MISSILE,
SPECIAL_SUNSTORM_MISSILE,
Expand All @@ -138,11 +141,83 @@ enum SpecialPowerType CPP_11(: Int)
SPECIAL_CHEMICAL_MISSILE,
SPECIAL_CHRONOSPHERE,

AIRF_SPECIAL_HOLO_PLANES,
AIRF_SPECIAL_PARADROP_AMERICA,
AIRF_SPECIAL_HELICOPTER_AMBUSH,
AIRF_SPECIAL_SPY_SATELLITE,
AIRF_SPECIAL_CIA_INTELLIGENCE,
AIRF_SPECIAL_SUPERSONIC_AIRSTRIKE,
AIRF_SPECIAL_HEAVY_AIRSTRIKE,

SOCOM_SPECIAL_SUPPLY_DROP,
SOCOM_SPECIAL_TANK_PARADROP,
SOCOM_SPECIAL_COASTAL_BOMBARDEMENT,
SOCOM_SPECIAL_AIR_DEPLOY_MARKER,

TANK_SPECIAL_CLUSTER_MINES,
TANK_SPECIAL_TANK_PARADROP,
TANK_SPECIAL_REPAIR_VEHICLES,
TANK_SPECIAL_EMP_PULSE,
TANK_SPECIAL_FRENZY,
TANK_SPECIAL_PARADROP,
TANK_SPECIAL_SPY_SATELLITE,
TANK_SPECIAL_ARTILLERY_BARRAGE,
TANK_SPECIAL_NAPALM_BOMB,
TANK_SPECIAL_CHINA_CARPET_BOMB,

NUKE_SPECIAL_CASH_HACK,
NUKE_SPECIAL_REPAIR_VEHICLES,
NUKE_SPECIAL_FRENZY,
NUKE_SPECIAL_SPY_SATELLITE,
NUKE_SPECIAL_ARTILLERY_BARRAGE,
NUKE_SPECIAL_NEUTRON_BOMB,
NUKE_SPECIAL_NUCLEAR_AIRSTRIKE,
NUKE_SPECIAL_CHINA_CARPET_BOMB,
NUKE_SPECIAL_BALLISTIC_MISSILE,

SECW_SPECIAL_EMP_HACK,
SECW_SPECIAL_HUNTER_SEEKER,
SECW_SPECIAL_SPY_SATELLITE,
SECW_SPECIAL_DRONE_GUNSHIP,
SECW_SPECIAL_SYSTEM_HACK,

DEMO_SPECIAL_AMBUSH,
DEMO_SPECIAL_REPAIR_VEHICLES,
DEMO_SPECIAL_RADAR_VAN_SCAN,
DEMO_SPECIAL_SNEAK_ATTACK,
DEMO_SPECIAL_GPS_SCRAMBLER,
DEMO_SPECIAL_FRENZY,
DEMO_SPECIAL_ANTHRAX_BOMB,
DEMO_SPECIAL_SUICIDE_PLANE,
DEMO_SPECIAL_CARPET_BOMB,
DEMO_SPECIAL_ARTILLERY_BARRAGE,

CHEM_SPECIAL_AMBUSH,
CHEM_SPECIAL_REPAIR_VEHICLES,
CHEM_SPECIAL_RADAR_VAN_SCAN,
CHEM_SPECIAL_SNEAK_ATTACK,
CHEM_SPECIAL_VIRUS,
CHEM_SPECIAL_GPS_SCRAMBLER,
CHEM_SPECIAL_FRENZY,
CHEM_SPECIAL_ANTHRAX_BOMB,
CHEM_SPECIAL_CARPET_BOMB,
CHEM_SPECIAL_AIRSTRIKE,

FORT_SPECIAL_REPAIR_VEHICLES,
FORT_SPECIAL_GPS_SCRAMBLER,
FORT_SPECIAL_FRENZY,
FORT_SPECIAL_AIRSTRIKE,
FORT_SPECIAL_CARPET_BOMB,
FORT_SPECIAL_ARTILLERY_BARRAGE,

SPECIALPOWER_COUNT,
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// NEW CONSTANTS NEED A BEHAVIORTYPE DEFINED IN THE SPECIALPOWER OR return one in getFallbackBehaviorType in ActionManager.cpp
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// don't forget to add new strings to SpecialPowerMaskType::s_bitNameList[]
};
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

};
// Definition of these names is located in SpecialPower.cpp

#endif /* __SPECIALPOWERTYPE_H__ */
108 changes: 105 additions & 3 deletions GeneralsMD/Code/GameEngine/Source/Common/RTS/ActionManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1528,7 +1528,7 @@ Bool ActionManager::canDoSpecialPowerAtLocation( const Object *obj, const Coord3
if (behaviorType >= SPECIAL_ION_CANNON) { //first custom SP
behaviorType = spTemplate->getSpecialPowerBehaviorType();
if (behaviorType == SPECIAL_INVALID) {
behaviorType = SPECIAL_NEUTRON_MISSILE; // Default to behave like neutron missile, common behavior
behaviorType = getFallbackBehaviorType(spTemplate->getSpecialPowerType()); // use predefined fallbacks
}
}

Expand Down Expand Up @@ -1679,7 +1679,7 @@ Bool ActionManager::canDoSpecialPowerAtObject( const Object *obj, const Object *
if (behaviorType >= SPECIAL_ION_CANNON) { //first custom SP
behaviorType = spTemplate->getSpecialPowerBehaviorType();
if (behaviorType == SPECIAL_INVALID) {
behaviorType == SPECIAL_NEUTRON_MISSILE; // Default to behave like neutron missile, common behavior
behaviorType = getFallbackBehaviorType(spTemplate->getSpecialPowerType()); // use predefined fallbacks
}
}

Expand Down Expand Up @@ -1913,6 +1913,108 @@ Bool ActionManager::canDoSpecialPowerAtObject( const Object *obj, const Object *
return false;
}

SpecialPowerType ActionManager::getFallbackBehaviorType(SpecialPowerType type) {
/*For newly defined special power types a default fallback enum for same behavior can be defined here*/
switch (type) {
case AIRF_SPECIAL_PARADROP_AMERICA:
case SOCOM_SPECIAL_SUPPLY_DROP:
case SOCOM_SPECIAL_TANK_PARADROP:
case TANK_SPECIAL_TANK_PARADROP:
case TANK_SPECIAL_PARADROP:
return SPECIAL_PARADROP_AMERICA;

case AIRF_SPECIAL_CIA_INTELLIGENCE:
case SECW_SPECIAL_HUNTER_SEEKER:
return SPECIAL_CIA_INTELLIGENCE;

case AIRF_SPECIAL_SPY_SATELLITE:
case TANK_SPECIAL_SPY_SATELLITE:
case NUKE_SPECIAL_SPY_SATELLITE:
case SECW_SPECIAL_SPY_SATELLITE:
return SPECIAL_SPY_SATELLITE;

case AIRF_SPECIAL_SUPERSONIC_AIRSTRIKE:
case AIRF_SPECIAL_HEAVY_AIRSTRIKE:
case SOCOM_SPECIAL_COASTAL_BOMBARDEMENT:
case TANK_SPECIAL_NAPALM_BOMB:
case TANK_SPECIAL_CHINA_CARPET_BOMB:
case NUKE_SPECIAL_NUCLEAR_AIRSTRIKE:
case NUKE_SPECIAL_CHINA_CARPET_BOMB:
case NUKE_SPECIAL_BALLISTIC_MISSILE:
case SECW_SPECIAL_SYSTEM_HACK:
case DEMO_SPECIAL_SUICIDE_PLANE:
case DEMO_SPECIAL_CARPET_BOMB:
case CHEM_SPECIAL_CARPET_BOMB:
case CHEM_SPECIAL_AIRSTRIKE:
case FORT_SPECIAL_AIRSTRIKE:
case FORT_SPECIAL_CARPET_BOMB:
return SPECIAL_CARPET_BOMB;

case AIRF_SPECIAL_HELICOPTER_AMBUSH:
case DEMO_SPECIAL_AMBUSH:
case CHEM_SPECIAL_AMBUSH:
return SPECIAL_AMBUSH;

case AIRF_SPECIAL_HOLO_PLANES:
case TANK_SPECIAL_FRENZY:
case NUKE_SPECIAL_FRENZY:
case DEMO_SPECIAL_FRENZY:
case CHEM_SPECIAL_FRENZY:
case FORT_SPECIAL_FRENZY:
return SPECIAL_FRENZY;

case TANK_SPECIAL_CLUSTER_MINES:
return SPECIAL_CLUSTER_MINES;

case TANK_SPECIAL_REPAIR_VEHICLES:
case NUKE_SPECIAL_REPAIR_VEHICLES:
case DEMO_SPECIAL_REPAIR_VEHICLES:
case CHEM_SPECIAL_REPAIR_VEHICLES:
case FORT_SPECIAL_REPAIR_VEHICLES:
return SPECIAL_REPAIR_VEHICLES;

case TANK_SPECIAL_EMP_PULSE:
case NUKE_SPECIAL_NEUTRON_BOMB:
case SECW_SPECIAL_EMP_HACK:
return SPECIAL_EMP_PULSE;

case TANK_SPECIAL_ARTILLERY_BARRAGE:
case NUKE_SPECIAL_ARTILLERY_BARRAGE:
case DEMO_SPECIAL_ARTILLERY_BARRAGE:
case FORT_SPECIAL_ARTILLERY_BARRAGE:
return SPECIAL_ARTILLERY_BARRAGE;

case NUKE_SPECIAL_CASH_HACK:
return SPECIAL_CASH_HACK;

case SECW_SPECIAL_DRONE_GUNSHIP:
return SPECIAL_SPECTRE_GUNSHIP;

case DEMO_SPECIAL_RADAR_VAN_SCAN:
case CHEM_SPECIAL_RADAR_VAN_SCAN:
return SPECIAL_RADAR_VAN_SCAN;

case DEMO_SPECIAL_SNEAK_ATTACK:
case CHEM_SPECIAL_SNEAK_ATTACK:
return SPECIAL_SNEAK_ATTACK;

case DEMO_SPECIAL_GPS_SCRAMBLER:
case CHEM_SPECIAL_GPS_SCRAMBLER:
case FORT_SPECIAL_GPS_SCRAMBLER:
return SPECIAL_GPS_SCRAMBLER;

case DEMO_SPECIAL_ANTHRAX_BOMB:
case CHEM_SPECIAL_ANTHRAX_BOMB:
return SPECIAL_ANTHRAX_BOMB;

case CHEM_SPECIAL_VIRUS:
return SPECIAL_LEAFLET_DROP;

default:
return SPECIAL_NEUTRON_MISSILE;
}
}

// ------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------
Bool ActionManager::canDoSpecialPower( const Object *obj, const SpecialPowerTemplate *spTemplate, CommandSourceType commandSource, UnsignedInt commandOptions, Bool checkSourceRequirements )
Expand Down Expand Up @@ -1943,7 +2045,7 @@ Bool ActionManager::canDoSpecialPower( const Object *obj, const SpecialPowerTemp
if (behaviorType >= SPECIAL_ION_CANNON) { //first custom SP
behaviorType = spTemplate->getSpecialPowerBehaviorType();
if (behaviorType == SPECIAL_INVALID) {
behaviorType = SPECIAL_NEUTRON_MISSILE; // Default to behave like neutron missile, common behavior
behaviorType = getFallbackBehaviorType(spTemplate->getSpecialPowerType()); // use predefined fallbacks
}
}

Expand Down
69 changes: 69 additions & 0 deletions GeneralsMD/Code/GameEngine/Source/Common/RTS/SpecialPower.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,75 @@ const char* SpecialPowerMaskType::s_bitNameList[] =
"SPECIAL_CHEMICAL_MISSILE",
"SPECIAL_CHRONOSPHERE",

"AIRF_SPECIAL_HOLO_PLANES",
"AIRF_SPECIAL_PARADROP_AMERICA",
"AIRF_SPECIAL_HELICOPTER_AMBUSH",
"AIRF_SPECIAL_SPY_SATELLITE",
"AIRF_SPECIAL_CIA_INTELLIGENCE",
"AIRF_SPECIAL_SUPERSONIC_AIRSTRIKE",
"AIRF_SPECIAL_HEAVY_AIRSTRIKE",

"SOCOM_SPECIAL_SUPPLY_DROP",
"SOCOM_SPECIAL_TANK_PARADROP",
"SOCOM_SPECIAL_COASTAL_BOMBARDEMENT",
"SOCOM_SPECIAL_AIR_DEPLOY_MARKER",

"TANK_SPECIAL_CLUSTER_MINES",
"TANK_SPECIAL_TANK_PARADROP",
"TANK_SPECIAL_REPAIR_VEHICLES",
"TANK_SPECIAL_EMP_PULSE",
"TANK_SPECIAL_FRENZY",
"TANK_SPECIAL_PARADROP",
"TANK_SPECIAL_SPY_SATELLITE",
"TANK_SPECIAL_ARTILLERY_BARRAGE",
"TANK_SPECIAL_NAPALM_BOMB",
"TANK_SPECIAL_CHINA_CARPET_BOMB",

"NUKE_SPECIAL_CASH_HACK",
"NUKE_SPECIAL_REPAIR_VEHICLES",
"NUKE_SPECIAL_FRENZY",
"NUKE_SPECIAL_SPY_SATELLITE",
"NUKE_SPECIAL_ARTILLERY_BARRAGE",
"NUKE_SPECIAL_NEUTRON_BOMB",
"NUKE_SPECIAL_NUCLEAR_AIRSTRIKE",
"NUKE_SPECIAL_CHINA_CARPET_BOMB",
"NUKE_SPECIAL_BALLISTIC_MISSILE",

"SECW_SPECIAL_EMP_HACK",
"SECW_SPECIAL_HUNTER_SEEKER",
"SECW_SPECIAL_SPY_SATELLITE",
"SECW_SPECIAL_DRONE_GUNSHIP",
"SECW_SPECIAL_SYSTEM_HACK",

"DEMO_SPECIAL_AMBUSH",
"DEMO_SPECIAL_REPAIR_VEHICLES",
"DEMO_SPECIAL_RADAR_VAN_SCAN",
"DEMO_SPECIAL_SNEAK_ATTACK",
"DEMO_SPECIAL_GPS_SCRAMBLER",
"DEMO_SPECIAL_FRENZY",
"DEMO_SPECIAL_ANTHRAX_BOMB",
"DEMO_SPECIAL_SUICIDE_PLANE",
"DEMO_SPECIAL_CARPET_BOMB",
"DEMO_SPECIAL_ARTILLERY_BARRAGE",

"CHEM_SPECIAL_AMBUSH",
"CHEM_SPECIAL_REPAIR_VEHICLES",
"CHEM_SPECIAL_RADAR_VAN_SCAN",
"CHEM_SPECIAL_SNEAK_ATTACK",
"CHEM_SPECIAL_VIRUS",
"CHEM_SPECIAL_GPS_SCRAMBLER",
"CHEM_SPECIAL_FRENZY",
"CHEM_SPECIAL_ANTHRAX_BOMB",
"CHEM_SPECIAL_CARPET_BOMB",
"CHEM_SPECIAL_AIRSTRIKE",

"FORT_SPECIAL_REPAIR_VEHICLES",
"FORT_SPECIAL_GPS_SCRAMBLER",
"FORT_SPECIAL_FRENZY",
"FORT_SPECIAL_AIRSTRIKE",
"FORT_SPECIAL_CARPET_BOMB",
"FORT_SPECIAL_ARTILLERY_BARRAGE",

NULL
};

Expand Down