home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / internet / scripting / spruuids / gameoa.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-12  |  31.9 KB  |  1,317 lines

  1. //---------------------------------------------------------------------------
  2. // GameOA.cpp
  3. //---------------------------------------------------------------------------
  4. // Sample spr program, OLE Automation implementation
  5. //---------------------------------------------------------------------------
  6. // (C) Copyright 1992-1997 by Microsoft Corporation.  All rights reserved.
  7. //
  8. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  9. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  10. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  11. // PARTICULAR PURPOSE.
  12. //---------------------------------------------------------------------------
  13.  
  14. #include "Main.h"
  15. #pragma hdrstop
  16. #include "Game.h"
  17. #include "App.h"
  18. #include "Spr.h"
  19. #include "Score.h"
  20. #include "DispIDs.h"
  21. #include <math.h>
  22.  
  23.  
  24. //---------------------------------------------------------------------------
  25. // DEBUG info
  26. //---------------------------------------------------------------------------
  27. SZTHISFILE
  28.  
  29.  
  30. //---------------------------------------------------------------------------
  31. // Various Globals
  32. //---------------------------------------------------------------------------
  33. extern CGame *g_pgame;
  34. ITypeInfo *g_ptinfoClsGameOA = NULL;
  35. ITypeInfo *g_ptinfoIntGameOA = NULL;
  36.  
  37.  
  38.  
  39. //***************************************************************************
  40. // Constructor / Destructor
  41. //***************************************************************************
  42.  
  43. //---------------------------------------------------------------------------
  44. //
  45. //---------------------------------------------------------------------------
  46. CGameOA::CGameOA
  47. (
  48.   CGame *pgame
  49. )
  50. {
  51.   m_pgame           = pgame;
  52.   m_pdispBaseObject = NULL;
  53. }
  54.  
  55.  
  56.  
  57. //***************************************************************************
  58. // Fire IGameEvents Events
  59. //***************************************************************************
  60.  
  61. //---------------------------------------------------------------------------
  62. //
  63. //---------------------------------------------------------------------------
  64. void CGameOA::FireNewGame
  65. (
  66.   void
  67. )
  68. {
  69.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  70.  
  71.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  72.     if (*ppdisp)
  73.       InvokeEvent(*ppdisp, DISPID_GameEvents_NewGame, NULL, 0);
  74. }
  75.  
  76.  
  77. //---------------------------------------------------------------------------
  78. //
  79. //---------------------------------------------------------------------------
  80. void CGameOA::FireNewLevel
  81. (
  82.   void
  83. )
  84. {
  85.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  86.  
  87.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  88.     if (*ppdisp)
  89.       InvokeEvent(*ppdisp, DISPID_GameEvents_NewLevel, NULL, 0);
  90. }
  91.  
  92.  
  93. //---------------------------------------------------------------------------
  94. //
  95. //---------------------------------------------------------------------------
  96. void CGameOA::FireNewShip
  97. (
  98.   void
  99. )
  100. {
  101.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  102.  
  103.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  104.     if (*ppdisp)
  105.       InvokeEvent(*ppdisp, DISPID_GameEvents_NewShip, NULL, 0);
  106. }
  107.  
  108.  
  109. //---------------------------------------------------------------------------
  110. //
  111. //---------------------------------------------------------------------------
  112. void CGameOA::FireCollide
  113. (
  114.   CSprite *psprLowId,
  115.   CSprite *psprHighId,
  116.   int      maskCollide
  117. )
  118. {
  119.   IDispatch **ppdisp = g_pgame->m_pgameoa->m_cp.m_rgpdisp;
  120.   VARIANTARG  var[3];
  121.  
  122.   VariantInit(&var[2]);
  123.   var[2].vt = VT_DISPATCH;
  124.   var[2].pdispVal = psprLowId->GetDispatch();
  125.   psprLowId->AddRef();
  126.   VariantInit(&var[1]);
  127.   var[1].vt = VT_DISPATCH;
  128.   var[1].pdispVal = psprHighId->GetDispatch();
  129.   psprHighId->AddRef();
  130.   VariantInit(&var[0]);
  131.   var[0].vt = VT_I4;
  132.   var[0].lVal = maskCollide;
  133.  
  134.   for (; ppdisp < &g_pgame->m_pgameoa->m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  135.     if (*ppdisp)
  136.       InvokeEvent(*ppdisp, DISPID_GameEvents_Collide, var, 3);
  137.  
  138.   psprLowId->Release();     // For var[2].pdispVal
  139.   psprHighId->Release();    // For var[1].pdispVal
  140. }
  141.  
  142.  
  143. //---------------------------------------------------------------------------
  144. //
  145. //---------------------------------------------------------------------------
  146. void CGameOA::FireTick
  147. (
  148.   void
  149. )
  150. {
  151.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  152.  
  153.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  154.     if (*ppdisp)
  155.       InvokeEvent(*ppdisp, DISPID_GameEvents_Tick, NULL, 0);
  156. }
  157.  
  158.  
  159. //---------------------------------------------------------------------------
  160. //
  161. //---------------------------------------------------------------------------
  162. void CGameOA::FireKeyDown
  163. (
  164.   int vk
  165. )
  166. {
  167.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  168.   VARIANTARG  var[2];
  169.  
  170.   VariantInit(&var[0]);
  171.   var[0].vt   = VT_I4;
  172.   var[0].lVal = vk;
  173.  
  174.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  175.     if (*ppdisp)
  176.       InvokeEvent(*ppdisp, DISPID_GameEvents_KeyDown, var, 1);
  177. }
  178.  
  179.  
  180. //---------------------------------------------------------------------------
  181. //
  182. //---------------------------------------------------------------------------
  183. void CGameOA::FireKeyPress
  184. (
  185.   int ascii
  186. )
  187. {
  188.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  189.   VARIANTARG  var[1];
  190.  
  191.   VariantInit(&var[0]);
  192.   var[0].vt   = VT_I4;
  193.   var[0].lVal = ascii;
  194.  
  195.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  196.     if (*ppdisp)
  197.       InvokeEvent(*ppdisp, DISPID_GameEvents_KeyPress, var, 1);
  198. }
  199.  
  200.  
  201. //---------------------------------------------------------------------------
  202. //
  203. //---------------------------------------------------------------------------
  204. void CGameOA::FireKeyUp
  205. (
  206.   int vk
  207. )
  208. {
  209.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  210.   VARIANTARG  var[2];
  211.  
  212.   VariantInit(&var[0]);
  213.   var[0].vt   = VT_I4;
  214.   var[0].lVal = vk;
  215.  
  216.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  217.     if (*ppdisp)
  218.       InvokeEvent(*ppdisp, DISPID_GameEvents_KeyUp, var, 1);
  219. }
  220.  
  221.  
  222. //---------------------------------------------------------------------------
  223. //
  224. //---------------------------------------------------------------------------
  225. void CGameOA::FireMouseMove
  226. (
  227.   int  x,
  228.   int  y,
  229.   long mk
  230. )
  231. {
  232.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  233.   VARIANTARG  var[4];
  234.  
  235.   VariantInit(&var[3]);
  236.   var[3].vt = VT_I4;
  237.   var[3].lVal = (mk & MK_SHIFT   ? 1 : 0) |
  238.                 (mk & MK_CONTROL ? 2 : 0);
  239.   VariantInit(&var[2]);
  240.   var[2].vt = VT_I4;
  241.   var[2].lVal = (mk & MK_LBUTTON ? 1 : 0) |
  242.                 (mk & MK_RBUTTON ? 2 : 0) |
  243.                 (mk & MK_MBUTTON ? 4 : 0);
  244.   VariantInit(&var[1]);
  245.   var[1].vt = VT_I4;
  246.   var[1].lVal = x;
  247.   VariantInit(&var[0]);
  248.   var[0].vt = VT_I4;
  249.   var[0].lVal = y;
  250.  
  251.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  252.     if (*ppdisp)
  253.       InvokeEvent(*ppdisp, DISPID_GameEvents_MouseMove, var, 4);
  254. }
  255.  
  256.  
  257. //---------------------------------------------------------------------------
  258. //
  259. //---------------------------------------------------------------------------
  260. void CGameOA::FireMouseDown
  261. (
  262.   int  x,
  263.   int  y,
  264.   long mk,
  265.   long button
  266. )
  267. {
  268.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  269.   VARIANTARG  var[4];
  270.  
  271.   VariantInit(&var[3]);
  272.   var[3].vt = VT_I4;
  273.   var[3].lVal = (mk & MK_SHIFT   ? 1 : 0) |
  274.                 (mk & MK_CONTROL ? 2 : 0);
  275.   VariantInit(&var[2]);
  276.   var[2].vt = VT_I4;
  277.   var[2].lVal = (button & MK_LBUTTON ? 1 : 0) |
  278.                 (button & MK_RBUTTON ? 2 : 0) |
  279.                 (button & MK_MBUTTON ? 4 : 0);
  280.   VariantInit(&var[1]);
  281.   var[1].vt = VT_I4;
  282.   var[1].lVal = x;
  283.   VariantInit(&var[0]);
  284.   var[0].vt = VT_I4;
  285.   var[0].lVal = y;
  286.  
  287.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  288.     if (*ppdisp)
  289.       InvokeEvent(*ppdisp, DISPID_GameEvents_MouseDown, var, 4);
  290. }
  291.  
  292.  
  293. //---------------------------------------------------------------------------
  294. //
  295. //---------------------------------------------------------------------------
  296. void CGameOA::FireMouseUp
  297. (
  298.   int  x,
  299.   int  y,
  300.   long mk,
  301.   long button
  302. )
  303. {
  304.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  305.   VARIANTARG  var[4];
  306.  
  307.   VariantInit(&var[3]);
  308.   var[3].vt = VT_I4;
  309.   var[3].lVal = (mk & MK_SHIFT   ? 1 : 0) |
  310.                 (mk & MK_CONTROL ? 2 : 0);
  311.   VariantInit(&var[2]);
  312.   var[2].vt = VT_I4;
  313.   var[2].lVal = (button & MK_LBUTTON ? 1 : 0) |
  314.                 (button & MK_RBUTTON ? 2 : 0) |
  315.                 (button & MK_MBUTTON ? 4 : 0);
  316.   VariantInit(&var[1]);
  317.   var[1].vt = VT_I4;
  318.   var[1].lVal = x;
  319.   VariantInit(&var[0]);
  320.   var[0].vt = VT_I4;
  321.   var[0].lVal = y;
  322.  
  323.   for (; ppdisp < &m_cp.m_rgpdisp[GAME_cADVISE]; ppdisp++)
  324.     if (*ppdisp)
  325.       InvokeEvent(*ppdisp, DISPID_GameEvents_MouseUp, var, 4);
  326. }
  327.  
  328.  
  329. //***************************************************************************
  330. // IGame Interface
  331. //***************************************************************************
  332.  
  333. //---------------------------------------------------------------------------
  334. // 
  335. //---------------------------------------------------------------------------
  336. STDMETHODIMP CGameOA::get_Caption
  337. (
  338.   BSTR* pRet
  339. )
  340. {
  341.   if (!pRet)
  342.     return E_INVALIDARG;
  343.   UINT cch = GetWindowTextLength(m_pgame->m_hwndDlg);
  344.   char *pszT = new char[cch+1];
  345.   if (!pszT)
  346.     return E_OUTOFMEMORY;
  347.   *pRet = SysAllocStringLen(NULL, cch);
  348.   if (!*pRet)
  349.     {
  350.     delete [] pszT;
  351.     return E_OUTOFMEMORY;
  352.     }
  353.   GetWindowText(m_pgame->m_hwndDlg, pszT, cch+1);
  354.   MultiByteToWideChar(CP_ACP, 0, pszT, -1, *pRet, cch+1);
  355.   delete [] pszT;
  356.   return S_OK;
  357. }
  358.  
  359.  
  360. //---------------------------------------------------------------------------
  361. // 
  362. //---------------------------------------------------------------------------
  363. STDMETHODIMP CGameOA::put_Caption
  364. (
  365.   BSTR bstr
  366. )
  367. {
  368.   WCHAR *pwsz = bstr ? bstr : L"";
  369.   MAKE_ANSIPTR_FROMWIDE(pszT, pwsz);
  370.   SetWindowText(m_pgame->m_hwndDlg, pszT);
  371.   return S_OK;
  372. }
  373.  
  374.  
  375. //---------------------------------------------------------------------------
  376. // 
  377. //---------------------------------------------------------------------------
  378. STDMETHODIMP CGameOA::get_StatusText
  379. (
  380.   BSTR* pRet
  381. )
  382. {
  383.   if (!pRet)
  384.     return E_INVALIDARG;
  385.   UINT cch = GetWindowTextLength(m_pgame->m_hwndStat);
  386.   char *pszT = new char[cch+1];
  387.   if (!pszT)
  388.     return E_OUTOFMEMORY;
  389.   *pRet = SysAllocStringLen(NULL, cch);
  390.   if (!*pRet)
  391.     {
  392.     delete [] pszT;
  393.     return E_OUTOFMEMORY;
  394.     }
  395.   GetWindowText(m_pgame->m_hwndStat, pszT, cch+1);
  396.   MultiByteToWideChar(CP_ACP, 0, pszT, -1, *pRet, cch+1);
  397.   delete [] pszT;
  398.   return S_OK;
  399. }
  400.  
  401.  
  402. //---------------------------------------------------------------------------
  403. // 
  404. //---------------------------------------------------------------------------
  405. STDMETHODIMP CGameOA::put_StatusText
  406. (
  407.   BSTR bstr
  408. )
  409. {
  410.   WCHAR *pwsz = bstr ? bstr : L"";
  411.   MAKE_ANSIPTR_FROMWIDE(pszT, pwsz);
  412.   m_pgame->m_pscore->SetStatusText(pszT);
  413.   return S_OK;
  414. }
  415.  
  416.  
  417. //---------------------------------------------------------------------------
  418. // 
  419. //---------------------------------------------------------------------------
  420. STDMETHODIMP CGameOA::get_Application
  421. (
  422.   ISpruuidsApp** lppaReturn
  423. )
  424. {
  425.   return g_papp->QueryInterface(IID_ISpruuidsApp, (void **)lppaReturn);
  426. }
  427.  
  428.  
  429. //---------------------------------------------------------------------------
  430. // 
  431. //---------------------------------------------------------------------------
  432. STDMETHODIMP CGameOA::get_Parent
  433. (
  434.   ISpruuidsApp** lppaReturn
  435. )
  436. {
  437.   return g_papp->QueryInterface(IID_ISpruuidsApp, (void **)lppaReturn);
  438. }
  439.  
  440.  
  441. //---------------------------------------------------------------------------
  442. // 
  443. //---------------------------------------------------------------------------
  444. STDMETHODIMP CGameOA::StartGame
  445. (
  446.   void 
  447. )
  448. {
  449.   m_pgame->NewGame();
  450.   return S_OK;
  451. }
  452.  
  453.  
  454. //---------------------------------------------------------------------------
  455. // 
  456. //---------------------------------------------------------------------------
  457. STDMETHODIMP CGameOA::EndGame
  458. (
  459.   void 
  460. )
  461. {
  462.   m_pgame->GameOver();
  463.   return S_OK;
  464. }
  465.  
  466.  
  467. //---------------------------------------------------------------------------
  468. // 
  469. //---------------------------------------------------------------------------
  470. STDMETHODIMP CGameOA::RemoveAllSprites
  471. (
  472.   void 
  473. )
  474. {
  475.   m_pgame->m_pdisp->DestroyAll();
  476.   return S_OK;
  477. }
  478.  
  479.  
  480. //---------------------------------------------------------------------------
  481. // 
  482. //---------------------------------------------------------------------------
  483. STDMETHODIMP CGameOA::NextLevel
  484. (
  485.   void 
  486. )
  487. {
  488.   m_pgame->NewLevel();
  489.   return S_OK;
  490. }
  491.  
  492.  
  493. //---------------------------------------------------------------------------
  494. // 
  495. //---------------------------------------------------------------------------
  496. STDMETHODIMP CGameOA::Refresh
  497. (
  498.   void 
  499. )
  500. {
  501.   m_pgame->m_pdisp->Refresh();
  502.   return S_OK;
  503. }
  504.  
  505.  
  506. //---------------------------------------------------------------------------
  507. // 
  508. //---------------------------------------------------------------------------
  509. STDMETHODIMP CGameOA::AddScore
  510. (
  511.   int val
  512. )
  513. {
  514.   m_pgame->m_pscore->Add(val);
  515.   return S_OK;
  516. }
  517.  
  518.  
  519. //---------------------------------------------------------------------------
  520. //
  521. //---------------------------------------------------------------------------
  522. STDMETHODIMP CGameOA::StdBorderBounce
  523. (
  524.   ISprite *psprite,
  525.   int      brd
  526. )
  527. {
  528.   CSprite *pspr = SPRITEOFI(psprite);
  529.  
  530.   if ((brd & SPR_brdTOP) && pspr->m_vyFull < 0)
  531.     {
  532.     pspr->m_vyFull = -pspr->m_vyFull;
  533.     pspr->IgnoreMove();
  534.     }
  535.   if ((brd & SPR_brdLEFT) && pspr->m_vxFull < 0)
  536.     {
  537.     pspr->m_vxFull = -pspr->m_vxFull;
  538.     pspr->IgnoreMove();
  539.     }
  540.   if ((brd & SPR_brdBOTTOM) && pspr->m_vyFull > 0)
  541.     {
  542.     pspr->m_vyFull = -pspr->m_vyFull;
  543.     pspr->IgnoreMove();
  544.     }
  545.   if ((brd & SPR_brdRIGHT) && pspr->m_vxFull > 0)
  546.     {
  547.     pspr->m_vxFull = -pspr->m_vxFull;
  548.     pspr->IgnoreMove();
  549.     }
  550.   return S_OK;
  551. }
  552.  
  553.  
  554. //---------------------------------------------------------------------------
  555. //
  556. //---------------------------------------------------------------------------
  557. STDMETHODIMP CGameOA::StdBorderWrap
  558. (
  559.   ISprite *psprite,
  560.   int      brd
  561. )
  562. {
  563.   CSprite *pspr = SPRITEOFI(psprite);
  564.  
  565.   if ((brd & SPR_brdTOP) && pspr->m_vyFull < 0)
  566.     pspr->m_y = pspr->m_pdisp->m_cy;
  567.   if ((brd & SPR_brdLEFT) && pspr->m_vxFull < 0)
  568.     pspr->m_x = pspr->m_pdisp->m_cx;
  569.   if ((brd & SPR_brdBOTTOM) && pspr->m_vyFull > 0)
  570.     pspr->m_y = -pspr->m_pimg->cy;
  571.   if ((brd & SPR_brdRIGHT) && pspr->m_vxFull > 0)
  572.     pspr->m_x = -pspr->m_pimg->cx;
  573.   return S_OK;
  574. }
  575.  
  576.  
  577. //---------------------------------------------------------------------------
  578. // Generate a random number between 0 and n.
  579. //---------------------------------------------------------------------------
  580. int MyRand
  581. (
  582.   int n
  583. )
  584. {
  585.   int t, u;
  586.   static nLast=0, tLast=0;
  587.  
  588.   if (n <= 1)
  589.     return 0;
  590.  
  591.   n &= RAND_MAX;
  592.   if (n == nLast)
  593.     t = tLast;
  594.   else
  595.     {
  596.     nLast = n;
  597.     for (t=2; t<n; t<<=1)
  598.       ;
  599.     t--;
  600.     tLast = t;
  601.     }
  602.  
  603.   do
  604.     {
  605.     u = t & rand();
  606.     } while (u >= n);
  607.   return u;
  608. }
  609.  
  610.  
  611. //---------------------------------------------------------------------------
  612. // Init to random position which doesn't cause a collision event.
  613. //---------------------------------------------------------------------------
  614. STDMETHODIMP CGameOA::StdInitRand
  615. (
  616.   ISprite *psprite,
  617.   VARIANT  varUser
  618. )
  619. {
  620.   CSprite *pspr = SPRITEOFI(psprite);
  621.   CSprite *psprT;
  622.   LONG     x, y, dx, dy;
  623.   int      cx, cy;
  624.   int      lUser = (varUser.vt == VT_I4) ? varUser.lVal : 0;
  625.   LONG     dist = 8128;
  626.  
  627.   cx = pspr->m_pimg->cx;
  628.   cy = pspr->m_pimg->cy;
  629.   do
  630.     {
  631. Loop:
  632.     x = MyRand(pspr->m_pdisp->m_cx - cx);
  633.     y = MyRand(pspr->m_pdisp->m_cy - cy);
  634.     for (psprT=pspr->m_pdisp->m_psprFirst; psprT; psprT=psprT->m_psprNext)
  635.       {
  636.       if (!(psprT->m_psc->m_maskCollide & pspr->m_psc->m_maskCollide) && // if potential collision doesn't matter
  637.           x <= psprT->m_x+psprT->m_pimg->cx && x+cx >= psprT->m_x &&  // and we collide
  638.           y <= psprT->m_y+psprT->m_pimg->cy && y+cy >= psprT->m_y)
  639.     goto Loop;                              // then try another location
  640.       }
  641.     dx = (x - (pspr->m_pdisp->m_cx>>1));
  642.     dy = (y - (pspr->m_pdisp->m_cy>>1));
  643.     } while (dx*dx + dy*dy < dist);
  644.   pspr->m_x = (int)x;
  645.   pspr->m_y = (int)y;
  646.   return S_OK;
  647. }
  648.  
  649.  
  650. //---------------------------------------------------------------------------
  651. // Init to random position along edge of disp.
  652. //---------------------------------------------------------------------------
  653. STDMETHODIMP CGameOA::StdInitEdge
  654. (
  655.   ISprite *psprite,
  656.   VARIANT  varUser
  657. )
  658. {
  659.   CSprite *pspr = SPRITEOFI(psprite);
  660.  
  661.   if (rand() & 1)
  662.     {
  663.     pspr->m_x = MyRand(pspr->m_pdisp->m_cx - pspr->m_pimg->cx);
  664.     if (rand() & 1)
  665.       pspr->m_y = pspr->m_pdisp->m_cy - pspr->m_pimg->cy;
  666.     }
  667.   else
  668.     {
  669.     pspr->m_y = MyRand(pspr->m_pdisp->m_cy - pspr->m_pimg->cy);
  670.     if (rand() & 1)
  671.       pspr->m_x = pspr->m_pdisp->m_cx - pspr->m_pimg->cx;
  672.     }
  673.   return S_OK;
  674. }
  675.  
  676.  
  677. //---------------------------------------------------------------------------
  678. // 
  679. //---------------------------------------------------------------------------
  680. STDMETHODIMP CGameOA::get_Paused
  681. (
  682.   VARIANT_BOOL* pRet
  683. )
  684. {
  685.   *pRet = m_pgame->m_fPaused;
  686.   return S_OK;
  687. }
  688.  
  689.  
  690. //---------------------------------------------------------------------------
  691. // 
  692. //---------------------------------------------------------------------------
  693. STDMETHODIMP CGameOA::put_Paused
  694. (
  695.   VARIANT_BOOL val
  696. )
  697. {
  698.   m_pgame->Pause(!!val);
  699.   return S_OK;
  700. }
  701.  
  702.  
  703. //---------------------------------------------------------------------------
  704. // 
  705. //---------------------------------------------------------------------------
  706. STDMETHODIMP CGameOA::get_Width
  707. (
  708.   int* pRet
  709. )
  710. {
  711.   *pRet = m_pgame->m_pdisp->m_cx;
  712.   return S_OK;
  713. }
  714.  
  715.  
  716. //---------------------------------------------------------------------------
  717. // 
  718. //---------------------------------------------------------------------------
  719. STDMETHODIMP CGameOA::put_Width
  720. (
  721.   int val
  722. )
  723. {
  724.   if (val < 20 || val > 1024)
  725.     return E_FAIL;
  726.   m_pgame->m_pscore->Size(val, m_pgame->m_pdisp->m_cy);
  727.   return S_OK;
  728. }
  729.  
  730.  
  731. //---------------------------------------------------------------------------
  732. // 
  733. //---------------------------------------------------------------------------
  734. STDMETHODIMP CGameOA::get_Height
  735. (
  736.   int* pRet
  737. )
  738. {
  739.   *pRet = m_pgame->m_pdisp->m_cy;
  740.   return S_OK;
  741. }
  742.  
  743.  
  744. //---------------------------------------------------------------------------
  745. // 
  746. //---------------------------------------------------------------------------
  747. STDMETHODIMP CGameOA::put_Height
  748. (
  749.   int val
  750. )
  751. {
  752.   if (val < 20 || val > 1024)
  753.     return E_FAIL;
  754.   m_pgame->m_pscore->Size(m_pgame->m_pdisp->m_cx, val);
  755.   return S_OK;
  756. }
  757.  
  758.  
  759. //---------------------------------------------------------------------------
  760. // 
  761. //---------------------------------------------------------------------------
  762. STDMETHODIMP CGameOA::get_BackColor
  763. (
  764.   long* pRet
  765. )
  766. {
  767.   *pRet = m_pgame->m_pdisp->m_colorBack;
  768.   return S_OK;
  769. }
  770.  
  771.  
  772. //---------------------------------------------------------------------------
  773. // 
  774. //---------------------------------------------------------------------------
  775. STDMETHODIMP CGameOA::put_BackColor
  776. (
  777.   long val
  778. )
  779. {
  780.   if (val & 0xff000000)
  781.     return E_FAIL;
  782.   m_pgame->m_pdisp->SetBackColor(val);
  783.   return S_OK;
  784. }
  785.  
  786.  
  787. //---------------------------------------------------------------------------
  788. // 
  789. //---------------------------------------------------------------------------
  790. STDMETHODIMP CGameOA::get_Score
  791. (
  792.   int* pRet
  793. )
  794. {
  795.   *pRet = m_pgame->m_pscore->GetScore();
  796.   return S_OK;
  797. }
  798.  
  799.  
  800. //---------------------------------------------------------------------------
  801. // 
  802. //---------------------------------------------------------------------------
  803. STDMETHODIMP CGameOA::put_Score
  804. (
  805.   int val
  806. )
  807. {
  808.   m_pgame->m_pscore->SetScore(val);
  809.   return S_OK;
  810. }
  811.  
  812.  
  813. //---------------------------------------------------------------------------
  814. // 
  815. //---------------------------------------------------------------------------
  816. STDMETHODIMP CGameOA::get_Level
  817. (
  818.   int* pRet
  819. )
  820. {
  821.   *pRet = m_pgame->m_pscore->GetLevel();
  822.   return S_OK;
  823. }
  824.  
  825.  
  826. //---------------------------------------------------------------------------
  827. // 
  828. //---------------------------------------------------------------------------
  829. STDMETHODIMP CGameOA::put_Level
  830. (
  831.   int val
  832. )
  833. {
  834.   m_pgame->m_pscore->SetLevel(val);
  835.   return S_OK;
  836. }
  837.  
  838.  
  839. //---------------------------------------------------------------------------
  840. // 
  841. //---------------------------------------------------------------------------
  842. STDMETHODIMP CGameOA::get_ShipCount
  843. (
  844.   int* pRet
  845. )
  846. {
  847.   *pRet = m_pgame->m_pscore->GetCShip();
  848.   return S_OK;
  849. }
  850.  
  851.  
  852. //---------------------------------------------------------------------------
  853. // 
  854. //---------------------------------------------------------------------------
  855. STDMETHODIMP CGameOA::put_ShipCount
  856. (
  857.   int val
  858. )
  859. {
  860.   m_pgame->m_pscore->SetCShip(val);
  861.   return S_OK;
  862. }
  863.  
  864.  
  865. //---------------------------------------------------------------------------
  866. // 
  867. //---------------------------------------------------------------------------
  868. STDMETHODIMP CGameOA::get_ScoreFirst1Up
  869. (
  870.   int* pRet
  871. )
  872. {
  873.   *pRet = m_pgame->m_pscore->m_scoreFirst1Up;
  874.   return S_OK;
  875. }
  876.  
  877.  
  878. //---------------------------------------------------------------------------
  879. // 
  880. //---------------------------------------------------------------------------
  881. STDMETHODIMP CGameOA::put_ScoreFirst1Up
  882. (
  883.   int val
  884. )
  885. {
  886.   if (val < 0)
  887.     return E_FAIL;
  888.   m_pgame->m_pscore->m_scoreFirst1Up = val;
  889.   if (m_pgame->m_pscore->m_scoreSecond1Up < val)
  890.     m_pgame->m_pscore->m_scoreSecond1Up = val;
  891.   if (m_pgame->m_pscore->GetScore() < m_pgame->m_pscore->m_scoreFirst1Up)
  892.     m_pgame->m_pscore->m_scoreNext1Up = val;
  893.   return S_OK;
  894. }
  895.  
  896.  
  897. //---------------------------------------------------------------------------
  898. // 
  899. //---------------------------------------------------------------------------
  900. STDMETHODIMP CGameOA::get_ScoreSecond1Up
  901. (
  902.   int* pRet
  903. )
  904. {
  905.   *pRet = m_pgame->m_pscore->m_scoreSecond1Up;
  906.   return S_OK;
  907. }
  908.  
  909.  
  910. //---------------------------------------------------------------------------
  911. // 
  912. //---------------------------------------------------------------------------
  913. STDMETHODIMP CGameOA::put_ScoreSecond1Up
  914. (
  915.   int val
  916. )
  917. {
  918.   if (val < 0)
  919.     return E_FAIL;
  920.   m_pgame->m_pscore->m_scoreSecond1Up = val;
  921.   if (val < m_pgame->m_pscore->m_scoreFirst1Up)
  922.     m_pgame->m_pscore->m_scoreFirst1Up = val;
  923.   if (m_pgame->m_pscore->GetScore() > m_pgame->m_pscore->m_scoreFirst1Up  &&
  924.       m_pgame->m_pscore->GetScore() < m_pgame->m_pscore->m_scoreSecond1Up)
  925.     m_pgame->m_pscore->m_scoreNext1Up = val;
  926.   return S_OK;
  927. }
  928.  
  929.  
  930. //---------------------------------------------------------------------------
  931. // 
  932. //---------------------------------------------------------------------------
  933. STDMETHODIMP CGameOA::get_DScoreNext1Up
  934. (
  935.   int* pRet
  936. )
  937. {
  938.   *pRet = m_pgame->m_pscore->m_dscoreNext1Up;
  939.   return S_OK;
  940. }
  941.  
  942.  
  943. //---------------------------------------------------------------------------
  944. // 
  945. //---------------------------------------------------------------------------
  946. STDMETHODIMP CGameOA::put_DScoreNext1Up
  947. (
  948.   int val
  949. )
  950. {
  951.   if (val < 0)
  952.     return E_FAIL;
  953.   m_pgame->m_pscore->m_dscoreNext1Up = val;
  954.   if (m_pgame->m_pscore->GetScore() > m_pgame->m_pscore->m_scoreFirst1Up && m_pgame->m_pscore->GetScore() > 0)
  955.     {
  956.     m_pgame->m_pscore->m_scoreNext1Up = m_pgame->m_pscore->m_scoreFirst1Up;
  957.     while (m_pgame->m_pscore->m_scoreNext1Up < m_pgame->m_pscore->GetScore())
  958.       m_pgame->m_pscore->m_scoreNext1Up += m_pgame->m_pscore->m_dscoreNext1Up;
  959.     }
  960.   return S_OK;
  961. }
  962.  
  963.  
  964. //---------------------------------------------------------------------------
  965. // 
  966. //---------------------------------------------------------------------------
  967. STDMETHODIMP CGameOA::get_ShipsStart
  968. (
  969.   int* pRet
  970. )
  971. {
  972.   *pRet = m_pgame->m_pscore->m_cshipStart;
  973.   return S_OK;
  974. }
  975.  
  976.  
  977. //---------------------------------------------------------------------------
  978. // 
  979. //---------------------------------------------------------------------------
  980. STDMETHODIMP CGameOA::put_ShipsStart
  981. (
  982.   int val
  983. )
  984. {
  985.   if (val < 0)
  986.     return E_FAIL;
  987.   m_pgame->m_pscore->m_cshipStart = val;
  988.   return S_OK;
  989. }
  990.  
  991.  
  992. //---------------------------------------------------------------------------
  993. // 
  994. //---------------------------------------------------------------------------
  995. STDMETHODIMP CGameOA::get_Tag
  996. (
  997.   VARIANT* pRet
  998. )
  999. {
  1000.   if (!pRet)
  1001.     return E_INVALIDARG;
  1002.   VariantInit(pRet);
  1003.   return VariantCopy(pRet, &m_pgame->m_varTag);
  1004. }
  1005.  
  1006.  
  1007. //---------------------------------------------------------------------------
  1008. // 
  1009. //---------------------------------------------------------------------------
  1010. STDMETHODIMP CGameOA::put_Tag
  1011. (
  1012.   VARIANT val
  1013. )
  1014. {
  1015.   return VariantCopy(&m_pgame->m_varTag, &val);
  1016. }
  1017.  
  1018.  
  1019.  
  1020. //***************************************************************************
  1021. // IDispatch Interface
  1022. //***************************************************************************
  1023.  
  1024. //---------------------------------------------------------------------------
  1025. // Method needed by COleAuto, so it can implement IDispatch for us.
  1026. //---------------------------------------------------------------------------
  1027. HRESULT CGameOA::GetTypeLibInfo
  1028. (
  1029.   HINSTANCE    *phinstOut,
  1030.   const GUID  **pplibidOut, 
  1031.   SHORT        *pwMajLib, 
  1032.   SHORT        *pwMinLib,
  1033.   const CLSID **ppclsidOut, 
  1034.   const IID   **ppiidOut, 
  1035.   ITypeLib   ***ppptlOut
  1036. )
  1037. {
  1038.   *phinstOut  = g_hinst;
  1039.   *pplibidOut = &LIBID_SPRUUIDS;
  1040.   *pwMajLib   = 1;
  1041.   *pwMinLib   = 0;
  1042.   *ppclsidOut = &CLSID_Game;
  1043.   *ppiidOut   = &IID_IGame;
  1044.   *ppptlOut   = &g_ptlMain;
  1045.   return S_OK;
  1046. }
  1047.  
  1048.  
  1049.  
  1050. //***************************************************************************
  1051. // IProvideClassInfo Interfaces
  1052. //***************************************************************************
  1053.  
  1054. //---------------------------------------------------------------------------
  1055. // 
  1056. //---------------------------------------------------------------------------
  1057. STDMETHODIMP CGameOA::GetClassInfo
  1058. (
  1059.   ITypeInfo** pptinfoOut
  1060. )
  1061. {
  1062.   HRESULT hr = ((COleAuto *)this)->CheckTypeInfo(0, 0x0409);
  1063.   if (hr)
  1064.     return hr;
  1065.   *pptinfoOut = g_ptinfoClsGameOA;
  1066.   (*pptinfoOut)->AddRef();
  1067.   return S_OK;
  1068. }
  1069.  
  1070.  
  1071.  
  1072.  
  1073. //***************************************************************************
  1074. // IConnectionPointContainer Interface
  1075. //***************************************************************************
  1076.  
  1077. //---------------------------------------------------------------------------
  1078. // 
  1079. //---------------------------------------------------------------------------
  1080. STDMETHODIMP CGameOA::EnumConnectionPoints
  1081. (
  1082.   LPENUMCONNECTIONPOINTS* ppEnum
  1083. )
  1084. {
  1085.   return E_NOTIMPL;   // UNDONE: Implement this method
  1086. }
  1087.  
  1088.  
  1089. //---------------------------------------------------------------------------
  1090. // 
  1091. //---------------------------------------------------------------------------
  1092. STDMETHODIMP CGameOA::FindConnectionPoint
  1093. (
  1094.   REFIID             iid,
  1095.   LPCONNECTIONPOINT* ppCpOut
  1096. )
  1097. {
  1098.   if (!ppCpOut)
  1099.     return E_INVALIDARG;
  1100.  
  1101.   if (iid == DIID_IGameEvents || iid == IID_IDispatch)
  1102.     {
  1103.     *ppCpOut = &m_cp;
  1104.     (*ppCpOut)->AddRef();
  1105.     return S_OK;
  1106.     }
  1107.     
  1108.   return E_NOINTERFACE;
  1109. }
  1110.  
  1111.  
  1112. //***************************************************************************
  1113. // Embedded IConnectionPoint Class
  1114. //***************************************************************************
  1115.  
  1116. //---------------------------------------------------------------------------
  1117. // 
  1118. //---------------------------------------------------------------------------
  1119. CGameOA::XCP::XCP
  1120. (
  1121.   void
  1122. )
  1123. {
  1124.   m_cref = 1;
  1125.   for (int i=0; i<GAME_cADVISE; i++)
  1126.     m_rgpdisp[i] = NULL;
  1127. }
  1128.  
  1129.  
  1130. //---------------------------------------------------------------------------
  1131. // 
  1132. //---------------------------------------------------------------------------
  1133. void CGameOA::XCP::Close
  1134. (
  1135.   void
  1136. )
  1137. {
  1138.   for (int i=0; i<SC_cADVISE; i++)
  1139.     if (m_rgpdisp[i])
  1140.       {
  1141.       m_rgpdisp[i]->Release();
  1142.       m_rgpdisp[i] = NULL;
  1143.       }
  1144. }
  1145.  
  1146.  
  1147. //---------------------------------------------------------------------------
  1148. // 
  1149. //---------------------------------------------------------------------------
  1150. STDMETHODIMP CGameOA::XCP::QueryInterface
  1151. (
  1152.   REFIID  iid,
  1153.   LPVOID* ppvObjOut
  1154. )
  1155. {
  1156.   if (!ppvObjOut)
  1157.     return E_INVALIDARG;
  1158.  
  1159.   *ppvObjOut = NULL;
  1160.  
  1161.   if (iid == IID_IUnknown)
  1162.     *ppvObjOut = this->GetUnknown();
  1163.   else if (iid == IID_IConnectionPoint)
  1164.     *ppvObjOut = (IConnectionPoint *)this;
  1165.  
  1166.   if (*ppvObjOut)
  1167.     {
  1168.     this->AddRef();
  1169.     return S_OK;
  1170.     }
  1171.  
  1172.   return E_NOINTERFACE;
  1173. }
  1174.  
  1175.  
  1176. //---------------------------------------------------------------------------
  1177. // 
  1178. //---------------------------------------------------------------------------
  1179. STDMETHODIMP_(ULONG) CGameOA::XCP::AddRef
  1180. (
  1181.   void 
  1182. )
  1183. {
  1184.   return ++m_cref;
  1185. }
  1186.  
  1187.  
  1188. //---------------------------------------------------------------------------
  1189. // 
  1190. //---------------------------------------------------------------------------
  1191. STDMETHODIMP_(ULONG) CGameOA::XCP::Release
  1192. (
  1193.   void 
  1194. )
  1195. {
  1196.   CGame *pgame = this->PGAMEOA()->m_pgame;
  1197.   ASSERT(m_cref, "bad m_cref");
  1198.   m_cref--;
  1199.   if (!m_cref && !pgame->m_cref)
  1200.     {
  1201.     delete pgame;
  1202.     return 0;
  1203.     }
  1204.   return m_cref;
  1205. }
  1206.  
  1207.  
  1208. //***************************************************************************
  1209. // IConnectionPoint Interface
  1210. //***************************************************************************
  1211.  
  1212. //---------------------------------------------------------------------------
  1213. // 
  1214. //---------------------------------------------------------------------------
  1215. STDMETHODIMP CGameOA::XCP::GetConnectionInterface
  1216. (
  1217.   IID* piid
  1218. )
  1219. {
  1220.   if (!piid)
  1221.     return E_INVALIDARG;
  1222.  
  1223.   memcpy(piid, &DIID_ISpriteClassEvents, sizeof(IID));
  1224.   return S_OK;
  1225. }
  1226.  
  1227.  
  1228. //---------------------------------------------------------------------------
  1229. // 
  1230. //---------------------------------------------------------------------------
  1231. STDMETHODIMP CGameOA::XCP::GetConnectionPointContainer
  1232. (
  1233.   IConnectionPointContainer** ppCPC
  1234. )
  1235. {
  1236.   if (!ppCPC)
  1237.     return E_INVALIDARG;
  1238.  
  1239.   *ppCPC = this->PGAMEOA();
  1240.   (*ppCPC)->AddRef();
  1241.   return S_OK;
  1242. }
  1243.  
  1244.  
  1245. //---------------------------------------------------------------------------
  1246. // 
  1247. //---------------------------------------------------------------------------
  1248. STDMETHODIMP CGameOA::XCP::Advise
  1249. (
  1250.   IUnknown* punkSink,
  1251.   DWORD*    pdwCookie
  1252. )
  1253. {
  1254.   IDispatch  *psce = NULL;
  1255.   IDispatch **ppdisp;
  1256.   HRESULT     hr;
  1257.  
  1258.   if (!punkSink || !pdwCookie)
  1259.     return E_INVALIDARG;
  1260.   *pdwCookie = 0;
  1261.  
  1262.   // Look for empty slot
  1263.   for (ppdisp=m_rgpdisp; *ppdisp && ppdisp<&m_rgpdisp[GAME_cADVISE]; ppdisp++)
  1264.     ;
  1265.   // Did we find one?
  1266.   if (ppdisp >= &m_rgpdisp[GAME_cADVISE])
  1267.     return E_FAIL;          // UNDONE: Error?
  1268.  
  1269.   // Now see if sink supports correct interface
  1270.   hr = punkSink->QueryInterface(DIID_ISpriteClassEvents, (void **)&psce);
  1271.   if (hr == E_NOINTERFACE)
  1272.     {
  1273.     hr = punkSink->QueryInterface(IID_IDispatch, (void **)&psce);
  1274.     if (hr)
  1275.       return hr;
  1276.     }
  1277.   ASSERT(psce, "QI but no ptr");
  1278.  
  1279.   // Finish advise by stashing punkSink QI'd to our interface
  1280.   *ppdisp = psce;       // AddRef'd from QI
  1281.   *pdwCookie = (ppdisp - m_rgpdisp) + 1;
  1282.  
  1283.   return S_OK;
  1284. }
  1285.  
  1286.  
  1287. //---------------------------------------------------------------------------
  1288. // 
  1289. //---------------------------------------------------------------------------
  1290. STDMETHODIMP CGameOA::XCP::Unadvise
  1291. (
  1292.   DWORD dwCookie
  1293. )
  1294. {
  1295.   if (!dwCookie || dwCookie > GAME_cADVISE)
  1296.     return E_INVALIDARG;
  1297.  
  1298.   m_rgpdisp[dwCookie-1]->Release();
  1299.   m_rgpdisp[dwCookie-1] = NULL;
  1300.   return S_OK;
  1301. }
  1302.  
  1303.  
  1304. //---------------------------------------------------------------------------
  1305. // 
  1306. //---------------------------------------------------------------------------
  1307. STDMETHODIMP CGameOA::XCP::EnumConnections
  1308. (
  1309.   LPENUMCONNECTIONS* ppEnum
  1310. )
  1311. {
  1312.   return E_NOTIMPL;   // UNDONE: Implement this method
  1313. }
  1314.  
  1315.  
  1316. //--- EOF -------------------------------------------------------------------
  1317.