GAME.H
//--------------------------------------------------------------------------- 
// Game.h 
//--------------------------------------------------------------------------- 
// Sample spr program 
//--------------------------------------------------------------------------- 
// (C) Copyright 1992-1997 by Microsoft Corporation.  All rights reserved. 
// 
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF  
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO  
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A  
// PARTICULAR PURPOSE. 
//--------------------------------------------------------------------------- 
 
//--------------------------------------------------------------------------- 
// Forward Delcares 
//--------------------------------------------------------------------------- 
class CDisplay; 
class CSpriteClass; 
class CSprite; 
class CScore; 
class CGameOA; 
 
 
//--------------------------------------------------------------------------- 
// 
//--------------------------------------------------------------------------- 
DEFINE_GUID(IID_IGameSubObjects, 0xb54f3741, 0x5b07, 0x11cf, 0xa4, 0xb0, 0x0, 0xaa, 0x0, 0x4a, 0x55, 0xe8); 
 
 
//--------------------------------------------------------------------------- 
// the CGame class 
//--------------------------------------------------------------------------- 
class CGame : public COleAuto,  
              public IActiveScriptSite, public IActiveScriptSiteWindow, 
              public IProvideMultipleClassInfo 
  { 
  friend class CGameOA; 
 
public: 
  static HRESULT CGame::CreateGame(HINSTANCE hinst, HWND hwnd, HWND hwndPS, HWND hwndStat, 
                                   IOleComponentManager *pcm, CGame **ppgameOut); 
  CGame(HINSTANCE hinst, HWND hwnd, HWND hwndPS, HWND hwndStat, IOleComponentManager *pcm); 
  ~CGame(); 
  void Close(void); 
 
  // *** IUnknown methods *** 
  STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj); 
  STDMETHOD_(ULONG, AddRef)(void); 
  STDMETHOD_(ULONG, Release)(void); 
  inline IUnknown  *GetUnknown(void)  {return (IDispatch *)(COleAuto *)this;}; 
  inline IDispatch *GetDispatch(void) {return (IDispatch *)(COleAuto *)this;}; 
 
  // *** IDispatch methods *** 
  STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) 
    { return COleAuto::GetTypeInfoCount(pctinfo); }; 
  STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo **pptinfoOut) 
    { return COleAuto::GetTypeInfo(itinfo, lcid, pptinfoOut); }; 
  STDMETHOD(GetIDsOfNames)(REFIID iid, OLECHAR **rgszNames, UINT cnames, LCID lcid, DISPID *rgdispid); 
  STDMETHOD(Invoke)(DISPID dispid, REFIID iid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT *pVarResult, EXCEPINFO *pexcepinfo, UINT *puArgErr); 
 
  // Override required by COleAuto: 
  virtual ITypeInfo **GetTinfoClsAddr(void) { return &g_ptinfoClsGame; }; 
  virtual ITypeInfo **GetTinfoIntAddr(void) { return &g_ptinfoIntGame; }; 
  virtual HRESULT GetTypeLibInfo(HINSTANCE *phinstOut, const GUID **pplibidOut,  
                                 SHORT *pwMajLibOut, SHORT *pwMinLibOut, 
                                 const CLSID **ppclsidOut, const IID **ppiidOut, 
                                 ITypeLib ***ppptlOut); 
  virtual IDispatch *GetPrimary() {return this->GetDispatch(); }; 
 
  // *** IProvideClassInfo methods *** 
  STDMETHOD(GetClassInfo)(ITypeInfo** pptinfoOut); 
  // *** IProvideClassInfo2 methods *** 
  STDMETHOD(GetGUID)(DWORD dwGuidKind, GUID* pGUID); 
  // *** IProvideMultipleClassInfo methods *** 
  STDMETHOD(GetMultiTypeInfoCount)(ULONG *pcti); 
  STDMETHOD(GetInfoOfIndex)(ULONG iti, DWORD dwFlags, ITypeInfo** pptiCoClass, DWORD* pdwTIFlags, ULONG* pcdispidReserved, IID* piidPrimary, IID* piidSource); 
 
// ##### BEGIN ACTIVEX SCRIPTING SUPPORT ##### 
  // *** IActiveScriptSite methods *** 
  STDMETHOD(GetLCID)(LCID *plcid); 
  STDMETHOD(GetItemInfo)(LPCOLESTR pstrName, DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti); 
  STDMETHOD(GetDocVersionString)(BSTR *pszVersion); 
  STDMETHOD(RequestItems)(void); 
  STDMETHOD(RequestTypeLibs)(void); 
  STDMETHOD(OnScriptTerminate)(const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo); 
  STDMETHOD(OnStateChange)(SCRIPTSTATE ssScriptState); 
  STDMETHOD(OnScriptError)(IActiveScriptError *pscripterror); 
  STDMETHOD(OnEnterScript)(void); 
  STDMETHOD(OnLeaveScript)(void); 
 
  // *** IActiveScriptSiteWindow methods *** 
  STDMETHOD(GetWindow)(HWND *phwnd); 
  STDMETHOD(EnableModeless)(BOOL fEnable); 
// #####  END  ACTIVEX SCRIPTING SUPPORT ##### 
 
  class CGameOA *m_pgameoa; 
 
  // *** General Methods *** 
  BOOL    DlgProc(  HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); 
  LRESULT PSWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); 
  void    NewLevel(void); 
  void    NewGame(void); 
  BOOL    Pause(int pause); 
  BOOL    FQueryTerminate(BOOL fPromptUser); 
  void    GameOver(void); 
  HRESULT ParseFile(char *pszFileName, LPCOLESTR pstrItemName); 
  HRESULT CreateScriptEngine(LPCOLESTR pstrItemName); 
  HRESULT BuildTypeInfo(void); 
 
  // *** Member Variables *** 
  HINSTANCE  m_hinst; 
  HWND       m_hwndDlg; 
  HWND       m_hwndPS; 
  HWND       m_hwndStat; 
  CScore    *m_pscore; 
  CDisplay  *m_pdisp; 
  UINT       m_cref; 
  VARIANT    m_varTag; 
  IOleComponentManager *m_pcm; 
// ##### BEGIN ACTIVEX SCRIPTING SUPPORT ##### 
  IActiveScript        *m_ps; 
  IActiveScriptParse   *m_psp; 
// #####  END  ACTIVEX SCRIPTING SUPPORT ##### 
 
  CLSID          m_clsidEngine; 
  static char   *s_pszError; 
 
  // Sub-Object support 
#define csubobjMAX    30 
  int           m_csubobj; 
  LPOLESTR      m_rgpwszSubObjs[csubobjMAX];   // Should really dynamically allocate this array 
  IDispatch    *m_rgpdispSubObjs[csubobjMAX];  // Should really dynamically allocate this array 
  CSpriteClass *m_rgpsc[csubobjMAX]; 
  GUID          m_libidSubObj; 
  CLSID         m_clsidSubObj; 
  IID           m_iidSubObj; 
 
  // These reset every new game 
  BOOL m_fPaused:1; 
  BOOL m_fShipDead:1; 
  BOOL m_fShipRestart:1; 
  BOOL m_fGameOver:1; 
 
  // DEBUG info 
  static HRESULT s_hr; 
  #define SIG_Game 'Game' 
  DECLARE_SIGNATURE(SIG_Game); 
  }; 
 
 
//--------------------------------------------------------------------------- 
// the CGameOA class; Ole automation implementation for static members 
// of the IGame interface. 
//--------------------------------------------------------------------------- 
class CGameOA : public IGame, public COleAuto, public IProvideClassInfo, 
                public IConnectionPointContainer 
  { 
public: 
  // *** Constructor / Destructor *** 
  CGameOA::CGameOA(CGame *); 
 
  // *** IUnknown methods *** 
  STDMETHOD(QueryInterface)(REFIID iid, void** ppvObj) {return m_pgame->QueryInterface(iid, ppvObj);}; 
  STDMETHOD_(ULONG, AddRef) (void)                     {return m_pgame->AddRef();}; 
  STDMETHOD_(ULONG, Release)(void)                     {return m_pgame->Release();}; 
  inline IDispatch *GetDispatch(void) {return (IGame *)this;}; 
 
  // *** IDispatch methods *** 
  DECLARE_STANDARD_DISPATCH(); 
  // Override required by COleAuto: 
  virtual ITypeInfo **GetTinfoClsAddr(void) { return &g_ptinfoClsGameOA; }; 
  virtual ITypeInfo **GetTinfoIntAddr(void) { return &g_ptinfoIntGameOA; }; 
  virtual HRESULT GetTypeLibInfo(HINSTANCE *phinstOut, const GUID **pplibidOut,  
                                 SHORT *pwMajLibOut, SHORT *pwMinLibOut, 
                                 const CLSID **ppclsidOut, const IID **ppiidOut, 
                                 ITypeLib ***ppptlOut); 
  virtual IDispatch *GetPrimary() {return this->GetDispatch(); }; 
 
  // *** IProvideClassInfo methods *** 
  STDMETHOD(GetClassInfo)(ITypeInfo** pptinfoOut); 
 
  // *** IConnectionPointContainer methods *** 
  STDMETHOD(EnumConnectionPoints)(LPENUMCONNECTIONPOINTS* ppEnum); 
  STDMETHOD(FindConnectionPoint)(REFIID iid, LPCONNECTIONPOINT* ppCP); 
 
  // *** IGame methods *** 
  STDMETHOD(get_Caption)(BSTR* lpbstrReturn); 
  STDMETHOD(put_Caption)(BSTR bstr); 
  STDMETHOD(get_Application)(ISpruuidsApp** lppaReturn); 
  STDMETHOD(get_Parent)(ISpruuidsApp** lppaReturn); 
  STDMETHOD(StartGame)(void); 
  STDMETHOD(EndGame)(void); 
  STDMETHOD(RemoveAllSprites)(void); 
  STDMETHOD(NextLevel)(void); 
  STDMETHOD(Refresh)(void); 
  STDMETHOD(AddScore)(int val); 
  STDMETHOD(StdBorderBounce)(ISprite* pspr, int brd); 
  STDMETHOD(StdBorderWrap)(  ISprite* pspr, int brd); 
  STDMETHOD(StdInitRand)(ISprite* pspr, VARIANT user); 
  STDMETHOD(StdInitEdge)(ISprite* pspr, VARIANT user); 
  STDMETHOD(get_Paused)(VARIANT_BOOL* pRet); 
  STDMETHOD(put_Paused)(VARIANT_BOOL val); 
  STDMETHOD(get_Width)(int* pRet); 
  STDMETHOD(put_Width)(int val); 
  STDMETHOD(get_Height)(int* pRet); 
  STDMETHOD(put_Height)(int val); 
  STDMETHOD(get_BackColor)(long* pRet); 
  STDMETHOD(put_BackColor)(long val); 
  STDMETHOD(get_Score)(int* pRet); 
  STDMETHOD(put_Score)(int val); 
  STDMETHOD(get_Level)(int* pRet); 
  STDMETHOD(put_Level)(int val); 
  STDMETHOD(get_ShipCount)(int* pRet); 
  STDMETHOD(put_ShipCount)(int val); 
  STDMETHOD(get_ScoreFirst1Up)(int* pRet); 
  STDMETHOD(put_ScoreFirst1Up)(int val); 
  STDMETHOD(get_ScoreSecond1Up)(int* pRet); 
  STDMETHOD(put_ScoreSecond1Up)(int val); 
  STDMETHOD(get_DScoreNext1Up)(int* pRet); 
  STDMETHOD(put_DScoreNext1Up)(int val); 
  STDMETHOD(get_ShipsStart)(int* pRet); 
  STDMETHOD(put_ShipsStart)(int val); 
  STDMETHOD(get_Tag)(VARIANT* pRet); 
  STDMETHOD(put_Tag)(VARIANT val); 
  STDMETHOD(get_StatusText)(BSTR* lpbstrReturn); 
  STDMETHOD(put_StatusText)(BSTR bstr); 
 
  class XCP : public IConnectionPoint 
    { 
    inline CGameOA *PGAMEOA(void) { return ((CGameOA *)((char *)this - (char *)&(((CGameOA *)0)->m_cp))); } 
 
  public: 
    XCP(); 
    void Close(void); 
 
    // *** IUnknown methods *** 
    STDMETHOD(QueryInterface)(REFIID iid, void** ppvObjOut); 
    STDMETHOD_(ULONG, AddRef)(void); 
    STDMETHOD_(ULONG, Release)(void); 
    inline IUnknown *GetUnknown(void) {return (IConnectionPoint *)this;}; 
 
    // *** IConnectionPoint methods *** 
    STDMETHOD(GetConnectionInterface)(IID* piid); 
    STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer** ppCPC); 
    STDMETHOD(Advise)(IUnknown* punkSink, DWORD* pdwCookie); 
    STDMETHOD(Unadvise)(DWORD dwCookie); 
    STDMETHOD(EnumConnections)(LPENUMCONNECTIONS* ppEnum); 
 
    // *** Member Variables *** 
    ULONG     m_cref; 
#define GAME_cADVISE 5 
    IDispatch *m_rgpdisp[GAME_cADVISE];     // Array of pdisps to call. 
    } m_cp; 
 
  // *** Event Methods *** 
  void FireNewGame(void); 
  void FireNewLevel(void); 
  void FireNewShip(void); 
  static void FireCollide(CSprite *psprMoved, CSprite *psprHit, int); 
  void FireTick(void); 
  void FireKeyDown(int vk); 
  void FireKeyPress(int ascii); 
  void FireKeyUp(int vk); 
  void FireMouseMove(int x, int y, long mk); 
  void FireMouseDown(int x, int y, long mk, long button); 
  void FireMouseUp(  int x, int y, long mk, long button); 
 
  // *** Member Variable *** 
  CGame *m_pgame; 
  }; 
 
//--- EOF -------------------------------------------------------------------