ReactOS 0.4.15-dev-5672-gf73ac17
spigame.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: Spider Solitaire
3 * LICENSE: See COPYING in top level directory
4 * FILE: base/applications/games/spider/spigame.cpp
5 * PURPOSE: Spider Solitaire game functions
6 * PROGRAMMER: Gregor Schneider
7 */
8
9#include "spider.h"
10
11#define NUM_DECK_CARDS 5
12#define NUM_SMALLER_STACKS 4
13#define NUM_CARD_COLORS 4
14#define NUM_ONECOLOR_CARDS 13
15#define NUM_STD_CARDS 52
16#define NUM_SPIDER_CARDS 104
17
22bool fGameStarted = false;
25extern TCHAR MsgDeal[];
26extern TCHAR MsgWin[];
27
29{
30 CardStack newStack;
31 int i, colors = 1, num = 0;
32
33 switch (dwDifficulty)
34 {
36 colors = 1;
37 break;
39 colors = 2;
40 break;
42 colors = 4;
43 break;
44 }
45 for (i = 0; i < NUM_SPIDER_CARDS; i++)
46 {
47 num += NUM_CARD_COLORS / colors;
48 Card newCard(num % NUM_STD_CARDS);
49 newStack.Push(newCard);
50 }
51 return newStack;
52}
53
54void NewGame(void)
55{
56 int i, j;
57 /* First four stack with five, all other with 4 */
58 int covCards = 5;
59 CardStack fakeDeck, temp;
60
62
63 /* Create a new card-deck, fake deck */
65 deck.Shuffle();
66 fakeDeck.NewDeck();
67 fakeDeck.Shuffle();
68
69 /* Reset progress value */
70 cardsFinished = 0;
71
72 /* Deal to each stack */
73 for (i = 0; i < NUM_STACKS; i++)
74 {
75 temp.Clear();
76 if (i == NUM_SMALLER_STACKS)
77 {
78 covCards--;
79 }
80 for (j = 0; j <= covCards; j++)
81 {
82 temp.Push(deck.Pop(1));
83 }
86 }
87 /* Deal five fake cards to the deck */
88 pDeck->SetCardStack(fakeDeck.Pop(5));
89
91 fGameStarted = false;
92}
93
94bool stackLookingGood(const CardStack &mystack, int numChecks)
95{
96 int i;
97 for (i = 0; i < numChecks; i++)
98 {
99 if (mystack[i].LoVal() != mystack[i + 1].LoVal() - 1)
100 {
101 return false;
102 }
103 if (mystack[i].Suit() != mystack[i + 1].Suit())
104 {
105 return false;
106 }
107 }
108 return true;
109}
110
111/* Card to be turned from a stack */
113{
114 int numfacedown;
115
116 stackobj.GetFaceDirection(&numfacedown);
117 if (stackobj.NumCards() <= numfacedown)
118 {
119 if (numfacedown > 0) numfacedown--;
120 stackobj.SetFaceDirection(CS_FACE_DOWNUP, numfacedown);
121 stackobj.Redraw();
122 }
123}
124
125/* Click on the deck */
126void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int NumDragCards)
127{
128 CardStack temp, fakeDeck = pDeck->GetCardStack();
129 fGameStarted = true;
130
131 if (fakeDeck.NumCards() != 0 && deck.NumCards() != 0)
132 {
133 int i, facedown, faceup;
134 /* Add one card to every stack */
135 for (i = 0; i < NUM_STACKS; i++)
136 {
138 temp.Push(deck.Pop());
139
140 /* Check if we accidentally finished a row */
141 pStack[i]->GetFaceDirection(&facedown);
142 faceup = temp.NumCards() - facedown;
143 if (faceup >= NUM_ONECOLOR_CARDS)
144 {
145 /* Check stack finished, remove cards if so */
147 {
148 int j;
149 for (j = 0; j < NUM_ONECOLOR_CARDS; j++)
150 {
151 temp.RemoveCard(0);
152 }
155 /* Turn now topmost card */
157 }
158 }
160 }
161 /* Remove one card from the fake ones */
162 pDeck->SetCardStack(fakeDeck.Pop(fakeDeck.NumCards() - 1));
163 }
164 pDeck->Update();
166}
167
168/* Cards dragged from a stack */
169bool CARDLIBPROC StackDragProc(CardRegion &stackobj, int numDragCards)
170{
171 int numfacedown, numcards;
172
173 stackobj.GetFaceDirection(&numfacedown);
174 numcards = stackobj.NumCards();
175
176 /* Only cards facing up */
177 if (numDragCards <= numcards - numfacedown)
178 {
179 const CardStack &mystack = stackobj.GetCardStack();
180 /* Don't allow to drag unsuited cards */
181 if (!stackLookingGood(mystack, numDragCards - 1))
182 {
183 return false;
184 }
185 /* Remember where the cards come from */
186 from = &stackobj;
187 return true;
188 }
189 else
190 {
191 return false;
192 }
193}
194
195/* Game finished successfully */
197{
199
202 {
203 NewGame();
204 }
205 else
206 {
207 fGameStarted = false;
208 }
209}
210
211/* Card added, check for win situation */
212void CARDLIBPROC StackAddProc(CardRegion &stackobj, const CardStack &added)
213{
215 {
216 GameFinished();
217 }
218}
219
220/* Cards dropped to a stack */
222{
223 Card dragcard = dragcards[dragcards.NumCards() - 1];
224 int faceup, facedown;
225
226 /* Only drop our cards on other stacks */
227 if (stackobj.Id() == from->Id())
228 {
229 return false;
230 }
231
232 /* If stack is empty, everything can be dropped */
233 if (stackobj.NumCards() != 0)
234 {
235 const CardStack &mystack = stackobj.GetCardStack();
236
237 /* Can only drop if card is 1 less */
238 if (mystack[0].LoVal() != dragcard.LoVal() + 1)
239 {
240 return false;
241 }
242
243 /* Check if stack complete */
244 stackobj.GetFaceDirection(&facedown);
245 faceup = stackobj.NumCards() - facedown;
246
247 if (faceup + dragcards.NumCards() >= NUM_ONECOLOR_CARDS)
248 {
249 int i, max = NUM_ONECOLOR_CARDS - dragcards.NumCards() - 1;
250
251 /* Dragged cards have been checked to be in order, check stack cards */
252 if (mystack[0].Suit() == dragcard.Suit() &&
253 stackLookingGood(mystack, max))
254 {
255 CardStack s = stackobj.GetCardStack();
256 CardStack f;
257
258 /* Remove from card stack */
259 for (i = 0; i < max + 1; i++)
260 {
261 s.RemoveCard(0);
262 }
263 /* Remove dragged cards */
264 dragcards = f;
265 stackobj.SetCardStack(s);
267 /* Flip top card of the dest stack */
268 TurnStackCard(stackobj);
269 }
270 }
271 }
272 /* Flip the top card of the source stack */
274 fGameStarted = true;
275 return true;
276}
277
278/* Create card regions */
280{
281 int i, pos;
282
283 /* Compute the value for yRowStackCardOffset based on the height of the card, so the card number and suite isn't hidden on larger cards except Ace */
285
286 pDeck = SpiderWnd.CreateRegion(0, true, 0, 0, -15, 0);
293
294 /* Create the row stacks */
295 for (i = 0; i < NUM_STACKS; i++)
296 {
299 pos = i - NUM_STACKS/2;
301 pos * (__cardwidth + X_BORDER) + 6 * (X_BORDER + 1) + 3, 0);
306 }
307}
308
#define IDC_DIF_FOURCOLORS
Definition: resource.h:34
#define IDC_DIF_ONECOLOR
Definition: resource.h:32
#define IDC_DIF_TWOCOLORS
Definition: resource.h:33
int __cardwidth
Definition: cardlib.cpp:25
int __cardheight
Definition: cardlib.cpp:26
#define CS_DROP_CALLBACK
Definition: cardlib.h:35
#define CARDLIBPROC
Definition: cardlib.h:13
#define CS_YJUST_BOTTOM
Definition: cardlib.h:42
#define CS_XJUST_CENTER
Definition: cardlib.h:39
#define CS_XJUST_RIGHT
Definition: cardlib.h:38
#define CS_FACE_DOWN
Definition: cardlib.h:52
#define CS_EI_SUNK
Definition: cardlib.h:19
#define CS_FACE_DOWNUP
Definition: cardlib.h:53
#define CS_EI_CIRC
Definition: cardlib.h:20
#define CS_DRAG_CALLBACK
Definition: cardlib.h:31
#define CS_DROP_NONE
Definition: cardlib.h:33
#define CS_DRAG_NONE
Definition: cardlib.h:28
void SetEmptyImage(UINT uImage)
Definition: cardregion.cpp:366
bool SetDropRule(UINT uDropType, pCanDropProc proc=0)
Definition: cardregion.cpp:164
void SetClickReleaseProc(pClickProc proc)
Definition: cardregion.cpp:187
bool SetDragRule(UINT uDragType, pCanDragProc proc=0)
Definition: cardregion.cpp:146
void SetPlacement(UINT xJustify, UINT yJustify, int xAdjust, int yAdjust)
Definition: cardregion.cpp:250
void SetAddCardProc(pAddProc proc)
Definition: cardregion.cpp:197
void Redraw()
void SetFaceDirection(UINT uDirType, int nOption)
Definition: cardregion.cpp:258
void SetCardStack(const CardStack &cs)
Definition: cardregion.cpp:390
const CardStack & GetCardStack()
Definition: cardregion.cpp:399
int NumCards() const
Definition: cardregion.cpp:544
void Update()
Definition: cardregion.cpp:207
UINT GetFaceDirection(int *pnOption)
Definition: cardregion.cpp:273
void NewDeck()
Definition: cardstack.cpp:42
int NumCards() const
Definition: cardstack.h:14
void Push(const Card card)
Definition: cardstack.cpp:83
void Shuffle()
Definition: cardstack.cpp:50
Card Pop()
Definition: cardstack.cpp:127
CardRegion * CreateRegion(int id, bool fVisible, int x, int y, int xoffset, int yoffset)
Definition: cardregion.cpp:104
void EmptyStacks(void)
Definition: cardwindow.cpp:607
void Redraw(void)
Definition: cardwindow.cpp:553
Definition: card.h:28
int Suit() const
Definition: card.h:54
int LoVal() const
Definition: card.h:59
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
GLdouble s
Definition: gl.h:2039
GLuint GLuint num
Definition: glext.h:9618
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define f
Definition: ke_i.h:83
static calc_node_t temp
Definition: rpn_ieee.c:38
TCHAR szAppName[128]
Definition: solitaire.cpp:17
#define Y_BORDER
Definition: solitaire.h:53
#define X_BORDER
Definition: solitaire.h:49
DWORD dwDifficulty
Definition: spider.cpp:25
CardWindow SpiderWnd
Definition: spider.cpp:27
#define NUM_STACKS
Definition: spider.h:21
CardRegion * pDeck
Definition: spigame.cpp:20
TCHAR MsgWin[]
Definition: solitaire.cpp:22
void CARDLIBPROC StackAddProc(CardRegion &stackobj, const CardStack &added)
Definition: spigame.cpp:212
CardRegion * from
Definition: spigame.cpp:19
bool CARDLIBPROC StackDragProc(CardRegion &stackobj, int numDragCards)
Definition: spigame.cpp:169
bool CARDLIBPROC StackDropProc(CardRegion &stackobj, CardStack &dragcards)
Definition: spigame.cpp:221
int yRowStackCardOffset
Definition: spigame.cpp:23
CardRegion * pStack[NUM_STACKS]
Definition: spigame.cpp:21
TCHAR MsgDeal[]
Definition: solitaire.cpp:23
void NewGame(void)
Definition: spigame.cpp:54
void GameFinished()
Definition: spigame.cpp:196
#define NUM_STD_CARDS
Definition: spigame.cpp:15
int cardsFinished
Definition: spigame.cpp:24
#define NUM_CARD_COLORS
Definition: spigame.cpp:13
#define NUM_SMALLER_STACKS
Definition: spigame.cpp:12
bool fGameStarted
Definition: spigame.cpp:22
#define NUM_SPIDER_CARDS
Definition: spigame.cpp:16
CardStack CreatePlayDeck()
Definition: spigame.cpp:28
void TurnStackCard(CardRegion &stackobj)
Definition: spigame.cpp:112
void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int NumDragCards)
Definition: spigame.cpp:126
bool stackLookingGood(const CardStack &mystack, int numChecks)
Definition: spigame.cpp:94
CardStack deck
Definition: spigame.cpp:18
#define NUM_ONECOLOR_CARDS
Definition: spigame.cpp:14
void CreateSpider()
Definition: spigame.cpp:279
#define max(a, b)
Definition: svc.c:63
#define MB_YESNO
Definition: winuser.h:811
#define MB_OK
Definition: winuser.h:784
#define MB_ICONQUESTION
Definition: winuser.h:783
#define MessageBox
Definition: winuser.h:5812
#define MB_ICONINFORMATION
Definition: winuser.h:796
#define IDYES
Definition: winuser.h:829
char TCHAR
Definition: xmlstorage.h:189