1998-07-24 19:43:32 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Name: card.cpp
|
|
|
|
// Purpose: Forty Thieves patience game
|
|
|
|
// Author: Chris Breeze
|
|
|
|
// Modified by:
|
|
|
|
// Created: 21/07/97
|
|
|
|
// RCS-ID: $Id$
|
|
|
|
// Copyright: (c) 1993-1998 Chris Breeze
|
|
|
|
// Licence: wxWindows licence
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
// Last modified: 22nd July 1998 - ported to wxWindows 2.0
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+-------------------------------------------------------------+
|
1998-07-27 20:50:48 +00:00
|
|
|
//| Description
|
|
|
|
//| A class for drawing playing cards.
|
|
|
|
//| Currently assumes that the card symbols have been
|
|
|
|
//| loaded into hbmap_symbols and the pictures for the
|
|
|
|
//| Jack, Queen and King have been loaded into
|
|
|
|
//| hbmap_pictures.
|
1998-07-24 19:43:32 +00:00
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
|
|
|
|
#ifdef __GNUG__
|
|
|
|
#pragma implementation
|
|
|
|
#pragma interface
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// For compilers that support precompilation, includes "wx/wx.h".
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
|
|
|
|
#ifdef __BORLANDC__
|
|
|
|
#pragma hdrstop
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef WX_PRECOMP
|
|
|
|
#include "wx/wx.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "forty.h"
|
|
|
|
#include "card.h"
|
|
|
|
|
1999-02-12 08:22:29 +00:00
|
|
|
#if defined(__WXGTK__) || defined(__WXMOTIF__)
|
1998-07-24 19:43:32 +00:00
|
|
|
#include "pictures.xpm"
|
|
|
|
#include "symbols.xbm"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
wxBitmap* Card::m_pictureBmap = 0;
|
|
|
|
wxBitmap* Card::m_symbolBmap = 0;
|
|
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Card::Card() |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Description: |
|
|
|
|
//| Constructor for a playing card. |
|
|
|
|
//| Checks that the value is in the range 1..52 and then |
|
|
|
|
//| initialises the suit, colour, pipValue and wayUp. |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
Card::Card(int value, WayUp way_up) :
|
|
|
|
m_wayUp(way_up)
|
|
|
|
{
|
|
|
|
if (!m_symbolBmap)
|
|
|
|
{
|
|
|
|
#ifdef __WXMSW__
|
|
|
|
m_symbolBmap = new wxBitmap("CardSymbols", wxBITMAP_TYPE_BMP_RESOURCE);
|
|
|
|
#else
|
|
|
|
m_symbolBmap = new wxBitmap(Symbols_bits, Symbols_width, Symbols_height);
|
|
|
|
#endif
|
|
|
|
if (!m_symbolBmap->Ok())
|
|
|
|
{
|
|
|
|
::wxMessageBox("Failed to load bitmap CardSymbols", "Error");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!m_pictureBmap)
|
|
|
|
{
|
|
|
|
#ifdef __WXMSW__
|
|
|
|
m_pictureBmap = new wxBitmap("CardPictures", wxBITMAP_TYPE_BMP_RESOURCE);
|
|
|
|
#else
|
|
|
|
m_pictureBmap = new wxBitmap(Pictures);
|
|
|
|
#endif
|
|
|
|
if (!m_pictureBmap->Ok())
|
|
|
|
{
|
|
|
|
::wxMessageBox("Failed to load bitmap CardPictures", "Error");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (value >= 1 && value <= PackSize)
|
|
|
|
{
|
|
|
|
switch ((value - 1) / 13)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
m_suit = clubs;
|
|
|
|
m_colour = black;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
m_suit = diamonds;
|
|
|
|
m_colour = red;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
m_suit = hearts;
|
|
|
|
m_colour = red;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
m_suit = spades;
|
|
|
|
m_colour = black;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
m_pipValue = 1 + (value - 1) % 13;
|
|
|
|
m_status = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_status = FALSE;
|
|
|
|
}
|
|
|
|
} // Card::Card()
|
|
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Card::~Card() |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Description: |
|
|
|
|
//| Destructor - nothing to do at present. |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
Card::~Card()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Card::Erase() |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Description: |
|
|
|
|
//| Erase the card at (x, y) by drawing a rectangle in the |
|
|
|
|
//| background colour. |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
void Card::Erase(wxDC& dc, int x, int y)
|
|
|
|
{
|
|
|
|
wxPen* pen = wxThePenList->FindOrCreatePen(
|
1998-12-11 09:59:20 +00:00
|
|
|
FortyApp::BackgroundColour(),
|
1998-07-24 19:43:32 +00:00
|
|
|
1,
|
|
|
|
wxSOLID
|
|
|
|
);
|
1998-12-11 09:59:20 +00:00
|
|
|
dc.SetPen(* pen);
|
1998-07-24 19:43:32 +00:00
|
|
|
dc.SetBrush(FortyApp::BackgroundBrush());
|
|
|
|
dc.DrawRectangle(x, y, CardWidth, CardHeight);
|
|
|
|
} // Card::Erase()
|
|
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Card::Draw() |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Description: |
|
|
|
|
//| Draw the card at (x, y). |
|
|
|
|
//| If the card is facedown draw the back of the card. |
|
|
|
|
//| If the card is faceup draw the front of the card. |
|
|
|
|
//| Cards are not held in bitmaps, instead they are drawn |
|
|
|
|
//| from their constituent parts when required. |
|
|
|
|
//| hbmap_symbols contains large and small suit symbols and |
|
|
|
|
//| pip values. These are copied to the appropriate part of |
|
|
|
|
//| the card. Picture cards use the pictures defined in |
|
|
|
|
//| hbmap_pictures. Note that only one picture is defined |
|
|
|
|
//| for the Jack, Queen and King, unlike a real pack where |
|
|
|
|
//| each suit is different. |
|
|
|
|
//| |
|
|
|
|
//| WARNING: |
|
|
|
|
//| The locations of these symbols is 'hard-wired' into the |
|
|
|
|
//| code. Editing the bitmaps or the numbers below will |
|
|
|
|
//| result in the wrong symbols being displayed. |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
void Card::Draw(wxDC& dc, int x, int y)
|
|
|
|
{
|
1999-02-10 11:56:15 +00:00
|
|
|
wxBrush backgroundBrush( dc.GetBackground() );
|
1998-12-11 09:59:20 +00:00
|
|
|
dc.SetBrush(* wxWHITE_BRUSH);
|
|
|
|
dc.SetPen(* wxBLACK_PEN);
|
1998-07-24 19:43:32 +00:00
|
|
|
dc.DrawRoundedRectangle(x, y, CardWidth, CardHeight, 4);
|
|
|
|
if (m_wayUp == facedown)
|
|
|
|
{
|
1998-12-11 09:59:20 +00:00
|
|
|
dc.SetBackground(* wxRED_BRUSH);
|
1998-07-24 19:43:32 +00:00
|
|
|
dc.SetBackgroundMode(wxSOLID);
|
|
|
|
wxBrush* brush = wxTheBrushList->FindOrCreateBrush(
|
|
|
|
"BLACK", wxCROSSDIAG_HATCH
|
|
|
|
);
|
1998-12-11 09:59:20 +00:00
|
|
|
dc.SetBrush(* brush);
|
1998-07-24 19:43:32 +00:00
|
|
|
|
|
|
|
dc.DrawRoundedRectangle(
|
|
|
|
x + 4, y + 4,
|
|
|
|
CardWidth - 8, CardHeight - 8,
|
|
|
|
2
|
|
|
|
);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
wxMemoryDC memoryDC;
|
1998-12-11 09:59:20 +00:00
|
|
|
memoryDC.SelectObject(* m_symbolBmap);
|
1998-07-24 19:43:32 +00:00
|
|
|
|
|
|
|
// dc.SetBackgroundMode(wxTRANSPARENT);
|
|
|
|
|
|
|
|
dc.SetTextBackground(*wxWHITE);
|
|
|
|
switch (m_suit)
|
|
|
|
{
|
|
|
|
case spades:
|
|
|
|
case clubs:
|
|
|
|
dc.SetTextForeground(*wxBLACK);
|
|
|
|
break;
|
|
|
|
case diamonds:
|
|
|
|
case hearts:
|
|
|
|
dc.SetTextForeground(*wxRED);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// Draw the value
|
|
|
|
dc.Blit(x + 3, y + 3, 6, 7,
|
|
|
|
&memoryDC, 6 * (m_pipValue - 1), 36, wxCOPY);
|
|
|
|
dc.Blit(x + CardWidth - 9, y + CardHeight - 11, 6, 7,
|
|
|
|
&memoryDC, 6 * (m_pipValue - 1), 43, wxCOPY);
|
|
|
|
|
|
|
|
// Draw the pips
|
|
|
|
dc.Blit(x + 11, y + 3, 7, 7,
|
|
|
|
&memoryDC, 7 * m_suit, 0, wxCOPY);
|
|
|
|
dc.Blit(x + CardWidth - 17, y + CardHeight - 11, 7, 7,
|
|
|
|
&memoryDC, 7 * m_suit, 7, wxCOPY);
|
|
|
|
|
|
|
|
switch (m_pipValue)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
dc.Blit(x - 5 + CardWidth / 2, y - 5 + CardHeight / 2, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 3:
|
|
|
|
dc.Blit(x - 5 + CardWidth / 2, y - 5 + CardHeight / 2, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
case 2:
|
|
|
|
dc.Blit(x - 5 + CardWidth / 2,
|
|
|
|
y - 5 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + CardWidth / 2,
|
|
|
|
y - 5 + 3 * CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
dc.Blit(x - 5 + CardWidth / 2, y - 5 + CardHeight / 2, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
case 4:
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 5 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 5 + 3 * CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 5 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 5 + 3 * CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 8:
|
|
|
|
dc.Blit(x - 5 + 5 * CardWidth / 10,
|
|
|
|
y - 5 + 5 * CardHeight / 8, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
case 7:
|
|
|
|
dc.Blit(x - 5 + 5 * CardWidth / 10,
|
|
|
|
y - 5 + 3 * CardHeight / 8, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
case 6:
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 5 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 5 + CardHeight / 2, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 5 + 3 * CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 5 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 5 + CardHeight / 2, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 5 + 3 * CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 10:
|
|
|
|
dc.Blit(x - 5 + CardWidth / 2,
|
|
|
|
y - 5 + 2 * CardHeight / 3, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
case 9:
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 6 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 6 + 5 * CardHeight / 12, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 5 + 7 * CardHeight / 12, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + CardWidth / 4,
|
|
|
|
y - 5 + 3 * CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 6 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 6 + 5 * CardHeight / 12, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 5 + 7 * CardHeight / 12, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + 3 * CardWidth / 4,
|
|
|
|
y - 5 + 3 * CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
dc.Blit(x - 5 + CardWidth / 2,
|
|
|
|
y - 5 + CardHeight / 3, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
break;
|
|
|
|
case 11:
|
|
|
|
case 12:
|
|
|
|
case 13:
|
1998-12-11 09:59:20 +00:00
|
|
|
memoryDC.SelectObject(* m_pictureBmap);
|
1998-07-24 19:43:32 +00:00
|
|
|
dc.Blit(x + 5, y - 5 + CardHeight / 4, 40, 45,
|
|
|
|
&memoryDC, 40 * (m_pipValue - 11), 0, wxCOPY);
|
1998-12-11 09:59:20 +00:00
|
|
|
memoryDC.SelectObject(* m_symbolBmap);
|
1998-07-24 19:43:32 +00:00
|
|
|
dc.Blit(x + 32, y - 3 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 14, wxCOPY);
|
|
|
|
dc.Blit(x + 7, y + 27 + CardHeight / 4, 11, 11,
|
|
|
|
&memoryDC, 11 * m_suit, 25, wxCOPY);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
1999-02-10 11:56:15 +00:00
|
|
|
dc.SetBackground( backgroundBrush );
|
1998-07-24 19:43:32 +00:00
|
|
|
} // Card:Draw()
|
|
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Card::DrawNullCard() |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
//| Description: |
|
|
|
|
//| Draws the outline of a card at (x, y). |
|
|
|
|
//| Used to draw place holders for empty piles of cards. |
|
|
|
|
//+-------------------------------------------------------------+
|
|
|
|
void Card::DrawNullCard(wxDC& dc, int x, int y)
|
|
|
|
{
|
1998-12-11 09:59:20 +00:00
|
|
|
wxPen* pen = wxThePenList->FindOrCreatePen(FortyApp::TextColour(), 1, wxSOLID);
|
1998-07-24 19:43:32 +00:00
|
|
|
dc.SetBrush(FortyApp::BackgroundBrush());
|
1998-12-11 09:59:20 +00:00
|
|
|
dc.SetPen(*pen);
|
1998-07-24 19:43:32 +00:00
|
|
|
dc.DrawRoundedRectangle(x, y, CardWidth, CardHeight, 4);
|
|
|
|
} // Card::DrawNullCard()
|
|
|
|
|
|
|
|
|