//---------------------------------------------------------------------------
// Score.h
//---------------------------------------------------------------------------
// Score object to track score, # lives, level.
//---------------------------------------------------------------------------
// (C) Copyright 1992-1996 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.
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Score class
//---------------------------------------------------------------------------
class CScore
  {
public:
  // *** Constructor / Destructor ***
  static HRESULT CreateScore(HINSTANCE hinst, HWND hwnd, HWND hwndPS, HWND hwndStat,
                             long scoreFirst1Up, long scoreSecond1Up, long dscoreNext1Up,
                             int cship, WORD idbmpShip, WORD idbmpPlus,
                             CScore **ppscoreOut);
  CScore(HINSTANCE hinst, HWND hwnd, HWND hwndPS, HWND hwndStat, long scoreSecond1Up, long scoreFirst1Up, long dscoreNext1Up, int cship, WORD idbmpShip, WORD idbmpPlus);
  ~CScore();

  // *** Public methods ***
  void NewGame(void);
  void Add(long d);
  void Paint(HDC hdc);
  void SetStatusText(const char *pszText);
  void Size(int cx, int cy);

  // *** Public accessor methods ***
  inline long GetScore(void)      {return m_score;};
  inline void SetScore(int s)     {m_score = s;   InvalidateRect(m_hwnd, &m_rectScore, TRUE);};
  inline long GetLevel(void)      {return m_lvl;};
  inline long GetCShip(void)      {return m_cship;};
  inline void SetLevel(int lvl)   {m_lvl = lvl;   InvalidateRect(m_hwnd, &m_rectLvl,  TRUE);};
  inline void NextLevel(void)     {m_lvl++;       InvalidateRect(m_hwnd, &m_rectLvl,  TRUE);};
  inline void SetCShip(int cship) {m_cship=cship; InvalidateRect(m_hwnd, &m_rectShip, TRUE);};
  inline void ShipKilled(void)    {m_cship--;     InvalidateRect(m_hwnd, &m_rectShip, TRUE);};
  inline int  GetSize(void)       {return m_cyMax;};

  // Public members
  long      m_scoreFirst1Up;
  long      m_scoreSecond1Up;
  long      m_dscoreNext1Up;
  short     m_cshipStart;
  long      m_scoreNext1Up; // Inits to m_scoreFirst1Up

private:
  // *** Private member variables ***
  // Reset at NewGame()
  long      m_score;        // Inits to 0
  short     m_cship;        // Inits to m_cshipStart
  short     m_lvl;          // Inits to 1

  // Static state passed into contructor
  HINSTANCE m_hinst;
  HWND      m_hwnd;
  HWND      m_hwndPS;
  HWND      m_hwndStat;

  // State calculated from static state
  RECT      m_rectScore;
  RECT      m_rectShip;
  RECT      m_rectLvl;
  HBITMAP   m_hbmpShip;
  HBITMAP   m_hbmpPlus;
  int       m_cyMax,  m_cyStat;
  int       m_cxShip, m_cyShip;
  int       m_cxPlus, m_cyPlus;

  // Set if constructor fails
  static HRESULT s_hr;

  // DEBUG info
  #define SIG_Score 'Scor'
  DECLARE_SIGNATURE(SIG_Score);
  };

//--- EOF -------------------------------------------------------------------
