]> git.saurik.com Git - wxWidgets.git/blobdiff - demos/forty/card.cpp
renaming and moving samples around
[wxWidgets.git] / demos / forty / card.cpp
diff --git a/demos/forty/card.cpp b/demos/forty/card.cpp
new file mode 100644 (file)
index 0000000..b74fcee
--- /dev/null
@@ -0,0 +1,358 @@
+/////////////////////////////////////////////////////////////////////////////
+// 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
+/////////////////////////////////////////////////////////////////////////////
+//+-------------------------------------------------------------+
+//| 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.
+//+-------------------------------------------------------------+
+
+#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"
+
+#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__)
+#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(
+                                               FortyApp::BackgroundColour(),
+                                               1,
+                                               wxSOLID
+                                               );
+       dc.SetPen(* pen);
+       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)
+{
+       wxBrush backgroundBrush( dc.GetBackground() );
+       dc.SetBrush(* wxWHITE_BRUSH);
+       dc.SetPen(* wxBLACK_PEN);
+       dc.DrawRoundedRectangle(x, y, CardWidth, CardHeight, 4);
+       if (m_wayUp == facedown)
+       {
+               dc.SetBackground(* wxRED_BRUSH);
+               dc.SetBackgroundMode(wxSOLID);
+               wxBrush* brush = wxTheBrushList->FindOrCreateBrush(
+                                                       "BLACK", wxCROSSDIAG_HATCH
+                                                       );
+               dc.SetBrush(* brush);
+
+               dc.DrawRoundedRectangle(
+                               x + 4, y + 4,
+                               CardWidth - 8, CardHeight - 8,
+                               2
+                               );
+       }
+       else
+       {
+               wxMemoryDC memoryDC;
+               memoryDC.SelectObject(* m_symbolBmap);
+
+//             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:
+                       memoryDC.SelectObject(* m_pictureBmap);
+                       dc.Blit(x + 5, y - 5 + CardHeight / 4, 40, 45,
+                               &memoryDC, 40 * (m_pipValue - 11), 0, wxCOPY);
+                       memoryDC.SelectObject(* m_symbolBmap);
+                       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;
+               }
+
+       }
+       dc.SetBackground( backgroundBrush );
+} // 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)
+{
+       wxPen* pen = wxThePenList->FindOrCreatePen(FortyApp::TextColour(), 1, wxSOLID);
+       dc.SetBrush(FortyApp::BackgroundBrush());
+       dc.SetPen(*pen);
+       dc.DrawRoundedRectangle(x, y, CardWidth, CardHeight, 4);
+} // Card::DrawNullCard()
+
+