//======== (C) Copyright 2002 Charles G. Cleveland All rights reserved. ========= // // The copyright to the contents herein is the property of Charles G. Cleveland. // The contents may be used and/or copied only with the written permission of // Charles G. Cleveland, or in accordance with the terms and conditions stipulated in // the agreement/contract under which the contents have been supplied. // // Purpose: // // $Workfile: AvHTechNodes.h $ // $Date: 2002/09/23 22:36:08 $ // //------------------------------------------------------------------------------- // $Log: AvHTechNodes.h,v $ // Revision 1.7 2002/09/23 22:36:08 Flayra // - Slight refactoring // // Revision 1.6 2002/07/08 17:20:32 Flayra // - Added hooks to support disallowing actions when a building is "busy" // //=============================================================================== #ifndef AVHTECHNODE_H #define AVHTECHNODE_H #include "../types.h" #include "AvHMessage.h" #include "AvHTechID.h" //NOTE (KGP): I've laid the groundwork for AvHTechNode to potentially become an abstract // interface so that it can be subclassed separately for Client and Server instead of having // #defines on the client side. The AvHMessageID is now a static field meant to uniquely // identify the node within the tree; this greatly simplifies the AvHTechTree class. This // has a side effect--assignment from another AvHTechNode doesn't change the AvHMessageID. // When you want to create a copy of an AvHTechNode, use clone() instead of equality--this // also eliminates the problem of slicing from the copy. // // The ability to subclass AvHTechNode also allows for a playtest configuration subclass // that automatically self-updates when the relevant fields are updated; this is something // I think is defintely worth doing for a couple days' work; it would completely replace // the BalanceChangeListener functions of AvHTechTree below with a system that only changes // components as necessary, which is much less CPU intensive. class AvHTechNode { public: AvHTechNode(const AvHMessageID inMessageID); AvHTechNode(const AvHTechNode& other); AvHTechNode(AvHMessageID inMessageID, AvHTechID inID, AvHTechID inPrereq1, AvHTechID inPrereq2, int inCost, int inBuildTime, bool inResearched = false); virtual ~AvHTechNode(void); virtual AvHTechNode* clone(void) const; //deleting this pointer is the responsibility of the caller. virtual void swap(AvHTechNode& other); //assignment by swap - see Scott Meyers, Effective C++ AvHMessageID getMessageID(void) const; AvHTechID getTechID(void) const; void setTechID(const AvHTechID inMessageID); AvHTechID getPrereqTechID1(void) const; void setPrereqTechID1(const AvHTechID inMessageID); AvHTechID getPrereqTechID2(void) const; void setPrereqTechID2(const AvHTechID inMessageID); int getCost(void) const; void setCost(const int inCost); int getBuildTime(void) const; void setBuildTime(const int inBuildTime); bool getIsResearchable(void) const; bool getIsResearched(void) const; bool getAllowMultiples(void) const; void setAllowMultiples(const bool inAllow = true); void setResearchable(bool inState = true); void setResearchState(bool inState); virtual bool operator==(const AvHTechNode& inTechNode) const; bool operator!=(const AvHTechNode& inTechNode) const; AvHTechNode& operator=(const AvHTechNode& inTechNode); private: // Adding a member? Change operator== and the copy contructor, too const AvHMessageID mMessageID; AvHTechID mTechID; AvHTechID mPrereqID1; AvHTechID mPrereqID2; int mCost; int mBuildTime; bool mResearchable; bool mResearched; bool mAllowMultiples; }; #endif