123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- // dispenser.h
- // Project: Nostril (aka Postal)
- //
- // History:
- // 03/19/97 JMI Started this dispenser item class using CItem3d as a
- // template.
- //
- // 03/20/97 JMI Added m_ulFileVersion, InstantiateDispensee(), and
- // SaveDispensee() members. Removed m_idDispensee.
- //
- // 03/21/97 JMI Added ms_sDispenseeFileCount.
- //
- // 04/23/97 JMI Added new logic type Exists and added a max for the number
- // of dispensees and a current number of dispensees dispensed.
- //
- // 06/14/97 JMI Made default logic type Timed.
- //
- // 06/27/97 JMI Added m_imRender and m_bEditMode.
- //
- // 06/28/97 JMI Added a function to render the dispensee,
- // RenderDisipensee().
- //
- // 06/30/97 JMI m_sDispenseeHotSpotX, m_sDispenseeHotSpotY, and
- // m_rcDispensee.
- //
- // 07/10/97 JMI Added GetClosestDude().
- // Also, added new logic type DistanceToDude.
- //
- // 07/21/97 JMI Added GetX(), GetY(), and GetZ().
- //
- // 07/28/97 JMI Changed m_lLogicParm1,2,3 to m_alLogicParms[4] (adding one
- // logic parm while changing the storage technique).
- //
- ////////////////////////////////////////////////////////////////////////////////
- #ifndef DISPENSER_H
- #define DISPENSER_H
- #include "RSPiX.h"
- #include "thing.h"
- #include "scene.h"
- #include "realm.h"
- #include "dude.h"
- class CDispenser : public CThing
- {
- //---------------------------------------------------------------------------
- // Types, enums, etc.
- //---------------------------------------------------------------------------
- public:
- typedef enum
- {
- Timed, // Must be 0.
- Exists,
- DistanceToDude,
- // Add new logic types above.
- NumLogicTypes
- } LogicType;
- typedef enum
- {
- NumParms = 4
- } Macros;
- typedef struct
- {
- char* pszName; // Name of logic (for list box).
- char* apszParms[NumParms]; // Parm descriptions or NULL for none.
- char* pszDescription; // Description of logic (for text box).
- } LogicInfo;
- //---------------------------------------------------------------------------
- // Variables
- //---------------------------------------------------------------------------
- public:
- CSprite2 m_sprite; // 2D sprite.
- RImage* m_pim; // 2D image resource ptr.
- RImage m_imRender; // Used to render dispenser
- // and dispensee in edit mode.
- ClassIDType m_idDispenseeType; // Type of object to dispense.
- RFile m_fileDispensee; // Mem file representing
- // dispensee.
- ULONG m_ulFileVersion; // File version of data stored
- // in m_fileDispensee.
- short m_sX; // Location of this object,
- short m_sY; // the dispenser, which is
- short m_sZ; // also the location at which
- // we will dispense the
- // dispensee.
- LogicType m_logictype; // Logic used for dispensing.
- long m_alLogicParms[NumParms]; // Generic parameters for logic.
- short m_sMaxDispensees; // Maximum number of dispensees.
- short m_sNumDispensees; // Number of dispensees already
- // dispensed.
- U16 m_u16IdDispensee; // ID of the last dispensee
- // we created.
- long m_lNextUpdate; // Time of next update.
- bool m_bEditMode; // true, if in edit mode, false
- // otherwise.
- short m_sDispenseeHotSpotX; // Hotspot of dispensee.
- short m_sDispenseeHotSpotY; // Hotspot of dispensee.
- RRect m_rcDispensee; // Rect of dispensee.
- short m_sSuspend;
- // Tracks file counter so we know when to load/save "common" data
- static short ms_sFileCount;
- static short ms_sDispenseeFileCount;
- //---------------------------------------------------------------------------
- // Static Variables
- //---------------------------------------------------------------------------
- public:
- // "Constant" values that we want to be able to tune using the editor
- // Descriptions of logic types and their parameters.
- static LogicInfo ms_aliLogics[NumLogicTypes];
- //---------------------------------------------------------------------------
- // Constructor(s) / destructor
- //---------------------------------------------------------------------------
- protected:
- // Constructor
- CDispenser(CRealm* pRealm)
- : CThing(pRealm, CDispenserID)
- {
- m_pim = NULL;
- m_idDispenseeType = TotalIDs; // This means none.
- m_sSuspend = FALSE;
- memset(m_alLogicParms, 0, sizeof(m_alLogicParms) );
- m_sMaxDispensees = 10;
- m_sNumDispensees = 0;
- m_u16IdDispensee = CIdBank::IdNil;
- m_logictype = Timed;
- m_bEditMode = false;
- m_sDispenseeHotSpotX = 0;
- m_sDispenseeHotSpotY = 0;
- }
- public:
- // Destructor
- ~CDispenser()
- {
- // Kill dispenser
- Kill();
- }
- //---------------------------------------------------------------------------
- // Required static functions
- //---------------------------------------------------------------------------
- public:
- // Construct object
- static short Construct( // Returns 0 if successfull, non-zero otherwise
- CRealm* pRealm, // In: Pointer to realm this object belongs to
- CThing** ppNew) // Out: Pointer to new object
- {
- short sResult = 0;
- *ppNew = new CDispenser(pRealm);
- if (*ppNew == 0)
- {
- sResult = -1;
- TRACE("CDispenser::Construct(): Couldn't construct CDispenser!\n");
- }
- return sResult;
- }
- //---------------------------------------------------------------------------
- // Required virtual functions (implimenting them as inlines doesn't pay!)
- //---------------------------------------------------------------------------
- public:
- // Load object (should call base class version!)
- short Load( // Returns 0 if successfull, non-zero otherwise
- RFile* pFile, // In: File to load from
- bool bEditMode, // In: True for edit mode, false otherwise
- short sFileCount, // In: File count (unique per file, never 0)
- ULONG ulFileVersion); // In: Version of file format to load.
- // Save object (should call base class version!)
- short Save( // Returns 0 if successfull, non-zero otherwise
- RFile* pFile, // In: File to save to
- short sFileCount); // In: File count (unique per file, never 0)
- // Startup object
- short Startup(void); // Returns 0 if successfull, non-zero otherwise
- // Shutdown object
- short Shutdown(void); // Returns 0 if successfull, non-zero otherwise
- // Suspend object
- void Suspend(void);
- // Resume object
- void Resume(void);
- // Update object
- // (virtual (Overridden here)).
- void Update(void);
- // Called by editor to init new object at specified position
- // (virtual (Overridden here)).
- short EditNew( // Returns 0 if successfull, non-zero otherwise
- short sX, // In: New x coord
- short sY, // In: New y coord
- short sZ); // In: New z coord
- // Called by editor to modify object.
- // (virtual (Overridden here)).
- short EditModify(void); // Returns 0 if successfull, non-zero otherwise
- // Called by editor to move object to specified position
- // (virtual (Overridden here)).
- short EditMove( // Returns 0 if successfull, non-zero otherwise
- short sX, // In: New x coord
- short sY, // In: New y coord
- short sZ); // In: New z coord
- // Called by editor to render object
- // (virtual (Overridden here)).
- void EditRender(void);
- // Give Edit a rectangle around this object
- // (virtual (Overridden here)).
- void EditRect(RRect* pRect);
- // Called by editor to get the hotspot of an object in 2D.
- // (virtual (Overridden here)).
- void EditHotSpot( // Returns nothiing.
- short* psX, // Out: X coord of 2D hotspot relative to
- // EditRect() pos.
- short* psY); // Out: Y coord of 2D hotspot relative to
- // EditRect() pos.
- // Get the coordinates of this thing.
- virtual // Overriden here.
- double GetX(void) { return (double)m_sX; }
- virtual // Overriden here.
- double GetY(void) { return (double)m_sY; }
- virtual // Overriden here.
- double GetZ(void) { return (double)m_sZ; }
- //---------------------------------------------------------------------------
- // Other functions
- //---------------------------------------------------------------------------
- public:
- // Message handling functions ////////////////////////////////////////////
- //---------------------------------------------------------------------------
- // Internal functions
- //---------------------------------------------------------------------------
- protected:
- // Init dispenser
- short Init( // Returns 0 if successfull, non-zero otherwise
- bool bEditMode); // true, if in edit mode; false, otherwise.
-
- // Kill dispenser
- void Kill(void);
- // Get all required resources
- short GetResources(void); // Returns 0 if successfull, non-zero otherwise
-
- // Free all resources
- void FreeResources(void);
- // Create a dispensee from the memfile, if open.
- short InstantiateDispensee( // Returns 0 on success.
- CThing** ppthing, // Out: New thing loaded from m_fileDispensee.
- bool bEditMode); // In: true if in edit mode.
- // Write dispensee to the memfile.
- short SaveDispensee( // Returns 0 on success.
- CThing* pthing); // In: Instance of Dispensee to save.
- // Render dispensee to m_imRender.
- short RenderDispensee( // Returns 0 on success.
- CThing* pthing); // In: Instance of Dispensee to render.
- // Get the closest dude.
- short GetClosestDudeDistance( // Returns 0 on success. Fails, if no dudes.
- long* plClosestDistance); // Out: Distance to closest dude.
- // Destroy an instantiated dispensee.
- void DestroyDispensee( // Returns nothing.
- CThing** ppthing); // In: Ptr to the instance.
- };
- #endif //DISPENSER_H
- ////////////////////////////////////////////////////////////////////////////////
- // EOF
- ////////////////////////////////////////////////////////////////////////////////
|