Skip to content
Open
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
5 changes: 3 additions & 2 deletions GeneralsMD/Code/GameEngine/Include/Common/Player.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ class Upgrade;
class UpgradeTemplate;
class SpecialPowerModule;

struct BattlePlanBonusesData;
class BattlePlanBonuses;

enum BattlePlanStatus CPP_11(: Int);
Expand Down Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand Down
37 changes: 18 additions & 19 deletions GeneralsMD/Code/GameEngine/Source/Common/RTS/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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<const BattlePlanBonusesData*>(userData);
Object *objectToValidate = obj;
Object *objectToModify = obj;

Expand Down Expand Up @@ -3584,33 +3584,32 @@ static void localApplyBattlePlanBonusesToObject( Object *obj, void *userData )
//-------------------------------------------------------------------------------------------------
void Player::applyBattlePlanBonusesForObject( Object *obj ) const
{
localApplyBattlePlanBonusesToObject( obj, m_battlePlanBonuses );
localApplyBattlePlanBonusesToObject( obj, static_cast<BattlePlanBonusesData*>(m_battlePlanBonuses) );
}

//-------------------------------------------------------------------------------------------------
//Object has just left our team, so remove it's bonuses!
//-------------------------------------------------------------------------------------------------
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);

Expand All @@ -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<BattlePlanBonusesData*>(m_battlePlanBonuses) = *bonus;
}
else
{
Expand All @@ -3639,7 +3638,7 @@ void Player::applyBattlePlanBonusesForPlayerObjects( const BattlePlanBonuses *bo
}

DUMPBATTLEPLANBONUSES(m_battlePlanBonuses, this, nullptr);
iterateObjects( localApplyBattlePlanBonusesToObject, (void*)bonus );
iterateObjects( localApplyBattlePlanBonusesToObject, const_cast<BattlePlanBonusesData *>(bonus) );
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Loading