From 4540794624f15b2b60250b2c9906459da0e9a095 Mon Sep 17 00:00:00 2001 From: pWn3d Date: Thu, 25 Sep 2025 20:39:23 +0200 Subject: [PATCH] add special power enums --- .../GameEngine/Include/Common/ActionManager.h | 3 +- .../Include/Common/SpecialPowerType.h | 77 ++++++++++++- .../Source/Common/RTS/ActionManager.cpp | 108 +++++++++++++++++- .../Source/Common/RTS/SpecialPower.cpp | 69 +++++++++++ 4 files changed, 252 insertions(+), 5 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/ActionManager.h b/GeneralsMD/Code/GameEngine/Include/Common/ActionManager.h index 6fbb6aecb56..d8e06f93054 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/ActionManager.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/ActionManager.h @@ -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 ////////////////////////////////////////////////////////////////////////////////////// diff --git a/GeneralsMD/Code/GameEngine/Include/Common/SpecialPowerType.h b/GeneralsMD/Code/GameEngine/Include/Common/SpecialPowerType.h index ed00807e788..9420e328e70 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/SpecialPowerType.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/SpecialPowerType.h @@ -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, @@ -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__ */ diff --git a/GeneralsMD/Code/GameEngine/Source/Common/RTS/ActionManager.cpp b/GeneralsMD/Code/GameEngine/Source/Common/RTS/ActionManager.cpp index b4a894235a3..d255a9ba910 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/ActionManager.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/ActionManager.cpp @@ -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 } } @@ -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 } } @@ -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 ) @@ -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 } } diff --git a/GeneralsMD/Code/GameEngine/Source/Common/RTS/SpecialPower.cpp b/GeneralsMD/Code/GameEngine/Source/Common/RTS/SpecialPower.cpp index 9dca020817f..b12c2162f95 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/SpecialPower.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/SpecialPower.cpp @@ -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 };