/* ** Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. ** ** File: CurrentTarget.cpp ** ** Author: ** ** Description: ** Implementation of the training library "CurrentTarget" interface. ** ** History: */ #include "pch.h" #include "CurrentTarget.h" #include "TypeIDTarget.h" namespace Training { //------------------------------------------------------------------------------ // class methods //------------------------------------------------------------------------------ /* void */ CurrentTarget::CurrentTarget (AbstractTarget* pTarget, bool bLockOnFirstFetch) : m_pTarget (pTarget), m_bLockOnFirstFetch (bLockOnFirstFetch), m_pFetched (0) { } //------------------------------------------------------------------------------ /* void */ CurrentTarget::~CurrentTarget (void) { delete m_pTarget; delete m_pFetched; } //------------------------------------------------------------------------------ /* ImodelIGC* */ CurrentTarget::operator ImodelIGC* (void) { // first, get the ship and its target IshipIGC* pShip = static_cast (static_cast (*m_pTarget)); assert (pShip); ImodelIGC* pTarget = pShip->GetCommandTarget (c_cmdCurrent); // there is an option to cache the target the first time this target is evaluated. // if that option is set... if (m_bLockOnFirstFetch) { // first check to see if we have done a fetch at all if (not m_pFetched) { // we haven't cached a target yet, so we need to get the target m_pFetched = new TypeIDTarget (pTarget ? pTarget->GetObjectType () : NA, pTarget ? pTarget->GetObjectID () : NA); } else { // we have cached a target, but the reason we want to cache the target is to // determine if a kill has happened, e.g. has the target been eliminated. The // problem is that the player may choose to change the target before // eliminating it, and then we are stuck waiting on the original target. Here // we check to see if the target has been changed w/o eliminating the // original target, and if so, adjust to compensate. ImodelIGC* pFetched = *m_pFetched; if ((pFetched != pTarget) and pFetched and pTarget) { // there has been such a change, so set up a new abstract target delete m_pFetched; m_pFetched = new TypeIDTarget (pTarget ? pTarget->GetObjectType () : NA, pTarget ? pTarget->GetObjectID () : NA); } } return (*m_pFetched); } // that option wasn't requested, so we just return the actual found target return pTarget; } //------------------------------------------------------------------------------ }