diff --git a/Generals/Code/GameEngine/Include/Common/Player.h b/Generals/Code/GameEngine/Include/Common/Player.h index 3bcfa6d3502..7f74f747f42 100644 --- a/Generals/Code/GameEngine/Include/Common/Player.h +++ b/Generals/Code/GameEngine/Include/Common/Player.h @@ -79,6 +79,7 @@ class Upgrade; class UpgradeTemplate; class SpecialPowerModule; +struct BattlePlanBonusesData; class BattlePlanBonuses; enum BattlePlanStatus CPP_11(: Int); @@ -344,12 +345,12 @@ class Player : public Snapshot //it's possible for multiple strategy centers to have the same plan, so we need //to keep track of that like radar. Keep in mind multiple strategy centers with //same plan do not stack, but different strategy centers with different plans do. - void changeBattlePlan( BattlePlanStatus plan, Int delta, BattlePlanBonuses *bonus ); + void changeBattlePlan( BattlePlanStatus plan, Int delta, BattlePlanBonusesData *bonus ); Int getNumBattlePlansActive() const { return m_bombardBattlePlans + m_holdTheLineBattlePlans + m_searchAndDestroyBattlePlans; } Int getBattlePlansActiveSpecific( BattlePlanStatus plan ) const; void applyBattlePlanBonusesForObject( Object *obj ) const; //New object or converted object gaining our current battle plan bonuses. void removeBattlePlanBonusesForObject( Object *obj ) const; //Object left team - void applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bonus ); //Battle plan bonuses changing, so apply to all of our objects! + void applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonusesData *bonus ); //Battle plan bonuses changing, so apply to all of our objects! Bool doesObjectQualifyForBattlePlan( Object *obj ) const; // If apply is false, then we are repealing already granted bonuses. diff --git a/Generals/Code/GameEngine/Include/GameLogic/Module/BattlePlanUpdate.h b/Generals/Code/GameEngine/Include/GameLogic/Module/BattlePlanUpdate.h index 18070aa5254..0c293c9b2f7 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Module/BattlePlanUpdate.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Module/BattlePlanUpdate.h @@ -103,10 +103,17 @@ enum BattlePlanStatus CPP_11(: Int) PLANSTATUS_SEARCHANDDESTROY, }; -class BattlePlanBonuses : public MemoryPoolObject +struct BattlePlanBonusesData { - MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(BattlePlanBonuses, "BattlePlanBonuses") -public: + BattlePlanBonusesData() //Default the bonuses to no change. + : m_armorScalar(1.0f) + , m_bombardment(0) + , m_searchAndDestroy(0) + , m_holdTheLine(0) + , m_sightRangeScalar(1.0f) + { + } + Real m_armorScalar; Int m_bombardment; //Represents having weapon bonuses for bombardment plan Int m_searchAndDestroy; //Represents having weapon bonuses for searchAndDestroy plan @@ -115,6 +122,11 @@ class BattlePlanBonuses : public MemoryPoolObject KindOfMaskType m_validKindOf; KindOfMaskType m_invalidKindOf; }; + +class BattlePlanBonuses : public BattlePlanBonusesData, public MemoryPoolObject +{ + MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(BattlePlanBonuses, "BattlePlanBonuses") +}; EMPTY_DTOR(BattlePlanBonuses) #define ALL_PLANS 1000000 //Used when stacking or removing plans -- we only remove the bonuses when it's 0 or negative. diff --git a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp index e9f29b1ec96..e2ee49bf255 100644 --- a/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/Generals/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -173,7 +173,7 @@ AsciiString kindofMaskAsAsciiString(KindOfMaskType m) s = "KINDOF_INVALID"; return s; } -void dumpBattlePlanBonuses(const BattlePlanBonuses *b, AsciiString name, const Player *p, const Object *o, AsciiString fname, Int line, Bool doDebugLog) +void dumpBattlePlanBonuses(const BattlePlanBonusesData *b, AsciiString name, const Player *p, const Object *o, AsciiString fname, Int line, Bool doDebugLog) { CRCDEBUG_LOG(("dumpBattlePlanBonuses() %s:%d %s\n Player %d(%ls) object %d(%s) armor:%g/%8.8X bombardment:%d, holdTheLine:%d, searchAndDestroy:%d sight:%g/%8.8X, valid:%s invalid:%s", fname.str(), line, name.str(), @@ -2917,7 +2917,7 @@ Bool Player::doesObjectQualifyForBattlePlan( Object *obj ) const //------------------------------------------------------------------------------------------------- // note, bonus is an in-out parm. -void Player::changeBattlePlan( BattlePlanStatus plan, Int delta, BattlePlanBonuses *bonus ) +void Player::changeBattlePlan( BattlePlanStatus plan, Int delta, BattlePlanBonusesData *bonus ) { DUMPBATTLEPLANBONUSES(bonus, this, nullptr); Bool addBonus = false; @@ -3014,7 +3014,7 @@ Int Player::getBattlePlansActiveSpecific( BattlePlanStatus plan ) const //------------------------------------------------------------------------------------------------ static void localApplyBattlePlanBonusesToObject( Object *obj, void *userData ) { - const BattlePlanBonuses* bonus = (const BattlePlanBonuses*)userData; + const BattlePlanBonusesData* bonus = static_cast(userData); Object *objectToValidate = obj; Object *objectToModify = obj; @@ -3093,7 +3093,7 @@ static void localApplyBattlePlanBonusesToObject( Object *obj, void *userData ) //------------------------------------------------------------------------------------------------- void Player::applyBattlePlanBonusesForObject( Object *obj ) const { - localApplyBattlePlanBonusesToObject( obj, m_battlePlanBonuses ); + localApplyBattlePlanBonusesToObject( obj, static_cast(m_battlePlanBonuses) ); } //------------------------------------------------------------------------------------------------- @@ -3101,25 +3101,24 @@ void Player::applyBattlePlanBonusesForObject( Object *obj ) const //------------------------------------------------------------------------------------------------- void Player::removeBattlePlanBonusesForObject( Object *obj ) const { - //Copy bonuses, and invert them. - BattlePlanBonuses* bonus = newInstance(BattlePlanBonuses); - *bonus = *m_battlePlanBonuses; - bonus->m_armorScalar = 1.0f / __max( bonus->m_armorScalar, 0.01f ); - bonus->m_sightRangeScalar = 1.0f / __max( bonus->m_sightRangeScalar, 0.01f ); - bonus->m_bombardment = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag - bonus->m_searchAndDestroy = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag - bonus->m_holdTheLine = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag + //Create inverted bonuses. + BattlePlanBonusesData bonus; + bonus.m_armorScalar = 1.0f / __max( m_battlePlanBonuses->m_armorScalar, 0.01f ); + bonus.m_sightRangeScalar = 1.0f / __max( m_battlePlanBonuses->m_sightRangeScalar, 0.01f ); + bonus.m_bombardment = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag + bonus.m_searchAndDestroy = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag + bonus.m_holdTheLine = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag + bonus.m_validKindOf = m_battlePlanBonuses->m_validKindOf; + bonus.m_invalidKindOf = m_battlePlanBonuses->m_invalidKindOf; - DUMPBATTLEPLANBONUSES(bonus, this, obj); - localApplyBattlePlanBonusesToObject( obj, bonus ); - - deleteInstance(bonus); + DUMPBATTLEPLANBONUSES(&bonus, this, obj); + localApplyBattlePlanBonusesToObject( obj, &bonus ); } //------------------------------------------------------------------------------------------------- //Battle plan bonuses changing, so apply to all of our objects! //------------------------------------------------------------------------------------------------- -void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bonus ) +void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonusesData *bonus ) { DUMPBATTLEPLANBONUSES(bonus, this, nullptr); @@ -3128,7 +3127,7 @@ void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bo { DEBUG_LOG(("Allocating new m_battlePlanBonuses")); m_battlePlanBonuses = newInstance( BattlePlanBonuses ); - *m_battlePlanBonuses = *bonus; + *static_cast(m_battlePlanBonuses) = *bonus; } else { @@ -3148,7 +3147,7 @@ void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bo } DUMPBATTLEPLANBONUSES(m_battlePlanBonuses, this, nullptr); - iterateObjects( localApplyBattlePlanBonusesToObject, (void*)bonus ); + iterateObjects( localApplyBattlePlanBonusesToObject, const_cast(bonus) ); } diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/BattlePlanUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/BattlePlanUpdate.cpp index 24620b7352d..228c347bb16 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/BattlePlanUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/BattlePlanUpdate.cpp @@ -143,15 +143,9 @@ BattlePlanUpdate::BattlePlanUpdate( Thing *thing, const ModuleData* moduleData ) m_invalidSettings = false; m_centeringTurret = false; - //Default the bonuses to no change. m_bonuses = newInstance(BattlePlanBonuses); - m_bonuses->m_armorScalar = 1.0f; - m_bonuses->m_sightRangeScalar = 1.0f; - m_bonuses->m_bombardment = 0; - m_bonuses->m_searchAndDestroy = 0; - m_bonuses->m_holdTheLine = 0; - m_bonuses->m_validKindOf = data->m_validMemberKindOf; - m_bonuses->m_invalidKindOf = data->m_invalidMemberKindOf; + m_bonuses->m_validKindOf = data->m_validMemberKindOf; + m_bonuses->m_invalidKindOf = data->m_invalidMemberKindOf; m_visionObjectID = INVALID_ID; diff --git a/GeneralsMD/Code/GameEngine/Include/Common/Player.h b/GeneralsMD/Code/GameEngine/Include/Common/Player.h index f57b7b58366..767f15c6ed9 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/Player.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/Player.h @@ -80,6 +80,7 @@ class Upgrade; class UpgradeTemplate; class SpecialPowerModule; +struct BattlePlanBonusesData; class BattlePlanBonuses; enum BattlePlanStatus CPP_11(: Int); @@ -368,12 +369,12 @@ class Player : public Snapshot //it's possible for multiple strategy centers to have the same plan, so we need //to keep track of that like radar. Keep in mind multiple strategy centers with //same plan do not stack, but different strategy centers with different plans do. - void changeBattlePlan( BattlePlanStatus plan, Int delta, BattlePlanBonuses *bonus ); + void changeBattlePlan( BattlePlanStatus plan, Int delta, BattlePlanBonusesData *bonus ); Int getNumBattlePlansActive() const { return m_bombardBattlePlans + m_holdTheLineBattlePlans + m_searchAndDestroyBattlePlans; } Int getBattlePlansActiveSpecific( BattlePlanStatus plan ) const; void applyBattlePlanBonusesForObject( Object *obj ) const; //New object or converted object gaining our current battle plan bonuses. void removeBattlePlanBonusesForObject( Object *obj ) const; //Object left team - void applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bonus ); //Battle plan bonuses changing, so apply to all of our objects! + void applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonusesData *bonus ); //Battle plan bonuses changing, so apply to all of our objects! Bool doesObjectQualifyForBattlePlan( Object *obj ) const; // If apply is false, then we are repealing already granted bonuses. diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/BattlePlanUpdate.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/BattlePlanUpdate.h index 5d101b7d5ad..47952342633 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/BattlePlanUpdate.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/BattlePlanUpdate.h @@ -103,10 +103,17 @@ enum BattlePlanStatus CPP_11(: Int) PLANSTATUS_SEARCHANDDESTROY, }; -class BattlePlanBonuses : public MemoryPoolObject +struct BattlePlanBonusesData { - MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(BattlePlanBonuses, "BattlePlanBonuses") -public: + BattlePlanBonusesData() //Default the bonuses to no change. + : m_armorScalar(1.0f) + , m_bombardment(0) + , m_searchAndDestroy(0) + , m_holdTheLine(0) + , m_sightRangeScalar(1.0f) + { + } + Real m_armorScalar; Int m_bombardment; //Represents having weapon bonuses for bombardment plan Int m_searchAndDestroy; //Represents having weapon bonuses for searchAndDestroy plan @@ -115,6 +122,11 @@ class BattlePlanBonuses : public MemoryPoolObject KindOfMaskType m_validKindOf; KindOfMaskType m_invalidKindOf; }; + +class BattlePlanBonuses : public BattlePlanBonusesData, public MemoryPoolObject +{ + MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE(BattlePlanBonuses, "BattlePlanBonuses") +}; EMPTY_DTOR(BattlePlanBonuses) #define ALL_PLANS 1000000 //Used when stacking or removing plans -- we only remove the bonuses when it's 0 or negative. diff --git a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp index f9d527d4370..7ac2172ae40 100644 --- a/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp +++ b/GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp @@ -174,7 +174,7 @@ AsciiString kindofMaskAsAsciiString(KindOfMaskType m) s = "KINDOF_INVALID"; return s; } -void dumpBattlePlanBonuses(const BattlePlanBonuses *b, AsciiString name, const Player *p, const Object *o, AsciiString fname, Int line, Bool doDebugLog) +void dumpBattlePlanBonuses(const BattlePlanBonusesData *b, AsciiString name, const Player *p, const Object *o, AsciiString fname, Int line, Bool doDebugLog) { CRCDEBUG_LOG(("dumpBattlePlanBonuses() %s:%d %s\n Player %d(%ls) object %d(%s) armor:%g/%8.8X bombardment:%d, holdTheLine:%d, searchAndDestroy:%d sight:%g/%8.8X, valid:%s invalid:%s", fname.str(), line, name.str(), @@ -3408,7 +3408,7 @@ Bool Player::doesObjectQualifyForBattlePlan( Object *obj ) const //------------------------------------------------------------------------------------------------- // note, bonus is an in-out parm. -void Player::changeBattlePlan( BattlePlanStatus plan, Int delta, BattlePlanBonuses *bonus ) +void Player::changeBattlePlan( BattlePlanStatus plan, Int delta, BattlePlanBonusesData *bonus ) { DUMPBATTLEPLANBONUSES(bonus, this, nullptr); Bool addBonus = false; @@ -3505,7 +3505,7 @@ Int Player::getBattlePlansActiveSpecific( BattlePlanStatus plan ) const //------------------------------------------------------------------------------------------------ static void localApplyBattlePlanBonusesToObject( Object *obj, void *userData ) { - const BattlePlanBonuses* bonus = (const BattlePlanBonuses*)userData; + const BattlePlanBonusesData* bonus = static_cast(userData); Object *objectToValidate = obj; Object *objectToModify = obj; @@ -3584,7 +3584,7 @@ static void localApplyBattlePlanBonusesToObject( Object *obj, void *userData ) //------------------------------------------------------------------------------------------------- void Player::applyBattlePlanBonusesForObject( Object *obj ) const { - localApplyBattlePlanBonusesToObject( obj, m_battlePlanBonuses ); + localApplyBattlePlanBonusesToObject( obj, static_cast(m_battlePlanBonuses) ); } //------------------------------------------------------------------------------------------------- @@ -3592,25 +3592,24 @@ void Player::applyBattlePlanBonusesForObject( Object *obj ) const //------------------------------------------------------------------------------------------------- void Player::removeBattlePlanBonusesForObject( Object *obj ) const { - //Copy bonuses, and invert them. - BattlePlanBonuses* bonus = newInstance(BattlePlanBonuses); - *bonus = *m_battlePlanBonuses; - bonus->m_armorScalar = 1.0f / __max( bonus->m_armorScalar, 0.01f ); - bonus->m_sightRangeScalar = 1.0f / __max( bonus->m_sightRangeScalar, 0.01f ); - bonus->m_bombardment = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag - bonus->m_searchAndDestroy = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag - bonus->m_holdTheLine = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag + //Create inverted bonuses. + BattlePlanBonusesData bonus; + bonus.m_armorScalar = 1.0f / __max( m_battlePlanBonuses->m_armorScalar, 0.01f ); + bonus.m_sightRangeScalar = 1.0f / __max( m_battlePlanBonuses->m_sightRangeScalar, 0.01f ); + bonus.m_bombardment = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag + bonus.m_searchAndDestroy = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag + bonus.m_holdTheLine = -ALL_PLANS; //Safe to remove as it clears the weapon bonus flag + bonus.m_validKindOf = m_battlePlanBonuses->m_validKindOf; + bonus.m_invalidKindOf = m_battlePlanBonuses->m_invalidKindOf; - DUMPBATTLEPLANBONUSES(bonus, this, obj); - localApplyBattlePlanBonusesToObject( obj, bonus ); - - deleteInstance(bonus); + DUMPBATTLEPLANBONUSES(&bonus, this, obj); + localApplyBattlePlanBonusesToObject( obj, &bonus ); } //------------------------------------------------------------------------------------------------- //Battle plan bonuses changing, so apply to all of our objects! //------------------------------------------------------------------------------------------------- -void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bonus ) +void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonusesData *bonus ) { DUMPBATTLEPLANBONUSES(bonus, this, nullptr); @@ -3619,7 +3618,7 @@ void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bo { DEBUG_LOG(("Allocating new m_battlePlanBonuses")); m_battlePlanBonuses = newInstance( BattlePlanBonuses ); - *m_battlePlanBonuses = *bonus; + *static_cast(m_battlePlanBonuses) = *bonus; } else { @@ -3639,7 +3638,7 @@ void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bo } DUMPBATTLEPLANBONUSES(m_battlePlanBonuses, this, nullptr); - iterateObjects( localApplyBattlePlanBonusesToObject, (void*)bonus ); + iterateObjects( localApplyBattlePlanBonusesToObject, const_cast(bonus) ); } diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/BattlePlanUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/BattlePlanUpdate.cpp index bce7925e59a..0b1909fc129 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/BattlePlanUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/BattlePlanUpdate.cpp @@ -143,15 +143,9 @@ BattlePlanUpdate::BattlePlanUpdate( Thing *thing, const ModuleData* moduleData ) m_invalidSettings = false; m_centeringTurret = false; - //Default the bonuses to no change. m_bonuses = newInstance(BattlePlanBonuses); - m_bonuses->m_armorScalar = 1.0f; - m_bonuses->m_sightRangeScalar = 1.0f; - m_bonuses->m_bombardment = 0; - m_bonuses->m_searchAndDestroy = 0; - m_bonuses->m_holdTheLine = 0; - m_bonuses->m_validKindOf = data->m_validMemberKindOf; - m_bonuses->m_invalidKindOf = data->m_invalidMemberKindOf; + m_bonuses->m_validKindOf = data->m_validMemberKindOf; + m_bonuses->m_invalidKindOf = data->m_invalidMemberKindOf; m_visionObjectID = INVALID_ID;