|
|
/***************************************************************************/ /** Microsoft Windows **/ /** Copyright(c) Microsoft Corp., 1991, 1992 **/ /***************************************************************************/
/****************************************************************************
player.h
Aug 92, JimH May 93, JimH chico port
Header file for class player
hierarchy: player / \ computer human / \ local_human remote_human
note: player and human are abstract classes.
pos == 0 implies local human id == 0 implies gamemeister
Relative to any human player, positions (pos) are arranged like this:
2 1 3 0
If the human is the gamemeister, these are also the id's.
****************************************************************************/
#include "card.h"
#include "debug.h"
#include "ddeml.h"
#ifndef PLAYER_INC
#define PLAYER_INC
const int HORZSPACING = 15; const int VERTSPACING = 15; const int IDGE = 3; // EDGE was defined as something else
const int MAXCARDSWON = 14;
typedef int SLOT;
enum modetype { STARTING, SELECTING, DONE_SELECTING, WAITING, ACCEPTING, PLAYING, SCORING };
const int MAXSLOT = 13;
const int ALL = -1;
struct handinfotype { int playerled; // id of player led
int turn; // whose turn? (0 to 3)
card *cardplayed[4]; // cards in play for each player
BOOL bHeartsBroken; // hearts broken in this hand?
BOOL bQSPlayed; // Queen of Spades played yet?
BOOL bShootingRisk; // someone trying to shoot the moon?
int nMoonShooter; // id of potential shooter
BOOL bHumanShooter; // is nMoonShooter a human player?
};
/* timer callback */
#if defined (MFC1)
UINT FAR PASCAL EXPORT TimerBadMove(HWND hWnd, UINT nMsg, int nIDEvent, DWORD dwTime); #else
void FAR PASCAL EXPORT TimerBadMove(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime); #endif
class CMainWindow;
class player {
private: CString name; CFont font;
protected: int id; // position relative to gamemeister
int position; // position relative to you
int score; card cd[MAXSLOT]; POINT loc; // location of cd[0]
int dx, dy; // offset for rest of cards
POINT playloc; // played cards glided to here
POINT homeloc; // won cards glided to here
POINT dotloc; // location of cd[0] "selected" dot
POINT nameloc; // location of name
modetype mode; int status;
int cardswon[MAXCARDSWON]; int numcardswon;
public: player(int n, int pos); virtual ~player() { } // required for ~local_human
card *Card(int s) { return &(cd[s]); } void DisplayHeartsWon(CDC &dc); void DisplayName(CDC &dc); int EvaluateScore(BOOL &bMoonShot); BOOL GetCardLoc(SLOT s, POINT& loc); SLOT GetSlot(int id); CRect &GetCoverRect(CRect& rect); int GetID(SLOT slot) { return cd[slot].ID(); } CRect &GetMarkingRect(CRect& rect); modetype GetMode() { return mode; } CString GetName() { return name; } int GetScore() { return score; } void GlideToCentre(SLOT s, BOOL bFaceup); void MarkCardPlayed(SLOT s) { cd[s].Play(); } void ResetCardsWon(void); void ResetLoc(void); void ReturnSelectedCards(int c[]); void Select(SLOT slot, BOOL bSelect) { cd[slot].Select(bSelect); } void SetID(SLOT slot, int id) { cd[slot].SetID(id); } void SetMode(modetype m) { mode = m; } void SetName(CString& newname, CDC& dc); void SetScore(int s) { score = s; } void SetStatus(int s) { status = s; } void Sort(void); void WinCard(CDC &dc, card *c);
virtual void Draw(CDC &dc, BOOL bCheating = FALSE, SLOT slot = ALL); virtual HCONV GetConv() { return NULL; } virtual BOOL IsHuman() { return FALSE; } virtual void MarkSelectedCards(CDC &dc); virtual void NotifyEndHand(handinfotype &h) = 0; virtual void NotifyNewRound(void) = 0;
virtual void ReceiveSelectedCards(int c[]); virtual void SelectCardsToPass(void) = 0; virtual void SelectCardToPlay(handinfotype &h, BOOL bCheating) = 0;
virtual void UpdateStatus(void) = 0; virtual void UpdateStatus(int stringid) = 0; virtual void UpdateStatus(const TCHAR *string) = 0;
virtual void Quit() { } virtual BOOL HasQuit() { return FALSE; } };
class human : public player {
private:
protected: human(int n, int pos);
public: virtual BOOL IsHuman() { return TRUE; }
#if defined(_DEBUG)
void DebugMove(SLOT slot) { \ TRACE1("<%d> human decides to ", id); PLAY(slot); TRACE0("\n"); } #endif
};
class remote_human : public human {
private: HCONV m_hConv; BOOL bQuit;
public: remote_human(int n, int pos, HCONV hConv);
virtual HCONV GetConv() { return m_hConv; } virtual void NotifyEndHand(handinfotype &h) { } virtual void NotifyNewRound() { } virtual void SelectCardsToPass(); virtual void SelectCardToPlay(handinfotype &h, BOOL bCheating); virtual void UpdateStatus() { } virtual void UpdateStatus(int stringid) { status = stringid; } virtual void UpdateStatus(const TCHAR *string) { } virtual void Quit() { bQuit = TRUE; } virtual BOOL HasQuit() { return bQuit; } };
class local_human : public human {
#if defined (MFC1)
friend UINT FAR PASCAL EXPORT TimerBadMove(HWND, UINT, int, DWORD); #else
friend void FAR PASCAL EXPORT TimerBadMove(HWND, UINT, UINT_PTR, DWORD); #endif
protected: CBitmap m_bmStretchCard; // bitmap for card + pop length
CStatusBarCtrl *m_pStatusWnd;
int XYToCard(int x, int y); void StartTimer(card &c);
static BOOL bTimerOn; static CString m_StatusText;
public: local_human(int n); ~local_human();
BOOL IsTimerOn() { return bTimerOn; } BOOL PlayCard(int x, int y, handinfotype &h, BOOL bCheating, BOOL bFlash = TRUE); void PopCard(CBrush &brush, int x, int y); void SetPlayerId(int n) { id = n; } void WaitMessage(const TCHAR *name);
virtual void Draw(CDC &dc, BOOL bCheating = FALSE, SLOT slot = ALL); virtual void MarkSelectedCards(CDC &dc) { return; } virtual void NotifyEndHand(handinfotype &h) { return; } virtual void NotifyNewRound(void) { return; } virtual void ReceiveSelectedCards(int c[]); virtual void SelectCardsToPass(void); virtual void SelectCardToPlay(handinfotype &h, BOOL bCheating); virtual void UpdateStatus(void); virtual void UpdateStatus(int stringid); virtual void UpdateStatus(const TCHAR *string); };
#endif // PLAYER_INC
|