2377 lines
68 KiB
C++
2377 lines
68 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "bagel/hodjnpodj/hnplibs/dibapi.h"
|
|
#include "bagel/hodjnpodj/hnplibs/stdafx.h"
|
|
#include "bagel/hodjnpodj/hnplibs/button.h"
|
|
#include "bagel/hodjnpodj/hnplibs/rules.h"
|
|
#include "bagel/hodjnpodj/hnplibs/sprite.h"
|
|
#include "bagel/hodjnpodj/hnplibs/cmessbox.h"
|
|
#include "bagel/boflib/misc.h"
|
|
#include "bagel/boflib/sound.h"
|
|
#include "bagel/hodjnpodj/poker/poker.h"
|
|
#include "bagel/hodjnpodj/poker/dialogs.h"
|
|
#include "bagel/hodjnpodj/poker/c1btndlg.h"
|
|
#include "bagel/hodjnpodj/hodjnpodj.h"
|
|
|
|
namespace Bagel {
|
|
namespace HodjNPodj {
|
|
namespace Poker {
|
|
|
|
|
|
// Game theme song
|
|
#define GAME_THEME ".\\SOUND\\VIDEOPO.MID"
|
|
|
|
// Rules File Identifiers
|
|
#define RULESFILE "POKER.TXT"
|
|
#define RULES_WAV ".\\SOUND\\POKER.WAV"
|
|
|
|
#define BETBUTTONS "ART\\BETBTNS.BMP"
|
|
#define BET1UP "ART\\BET1U.BMP"
|
|
|
|
#define CLEARBETUP "ART\\CLRBETU.BMP"
|
|
#define CLEARBETDOWN "ART\\CLRBETD.BMP"
|
|
#define CLEARBETDISABLED "ART\\CLRBETG.BMP"
|
|
|
|
#define DEALUP "ART\\DEALU.BMP"
|
|
#define DEALDOWN "ART\\DEALD.BMP"
|
|
#define DEALDISABLED "ART\\DEALG.BMP"
|
|
|
|
#define DRAWUP "ART\\DRAWU.BMP"
|
|
#define DRAWDOWN "ART\\DRAWD.BMP"
|
|
#define DRAWDISABLED "ART\\DRAWG.BMP"
|
|
|
|
#define HOLDBUTTONS "ART\\HOLDBTNS.BMP"
|
|
|
|
#define MAXBET 10000
|
|
|
|
extern CMainPokerWindow *pcwndPoker;
|
|
|
|
CPalette *pGamePalette = nullptr; // Palette to be used throughout the game
|
|
CPalette *pBtnPalette = nullptr; // Palette to be used throughout the game
|
|
CBmpButton *pOptionButton = nullptr; // Option button object for getting to the options dialog
|
|
|
|
|
|
// gtb
|
|
//static bool bIgnoreButtonClick = false;
|
|
int roundOfPlay;
|
|
|
|
CSprite *apCard[5]; // Bitmap buttons for displaying the cards
|
|
|
|
CBitmap *pBetButtons = nullptr;
|
|
CBmpButton *apBet[7];
|
|
CBitmap *pUpBmp = nullptr;
|
|
CBitmap *pDnBmp = nullptr;
|
|
CBitmap *pDsBmp = nullptr;
|
|
static const RECT arDstBet[7] = {
|
|
{ BET1_LEFT, BET1_TOP, BET1_LEFT + BET1_WIDTH, BET1_TOP + BET1_HEIGHT },
|
|
{ BET5_LEFT, BET5_TOP, BET5_LEFT + BET5_WIDTH, BET5_TOP + BET5_HEIGHT },
|
|
{ BET10_LEFT, BET10_TOP, BET10_LEFT + BET10_WIDTH, BET10_TOP + BET10_HEIGHT },
|
|
{ BET25_LEFT, BET25_TOP, BET25_LEFT + BET25_WIDTH, BET25_TOP + BET25_HEIGHT },
|
|
{ BET100_LEFT, BET100_TOP, BET100_LEFT + BET100_WIDTH, BET100_TOP + BET100_HEIGHT },
|
|
{ BET1000_LEFT, BET1000_TOP, BET1000_LEFT + BET1000_WIDTH, BET1000_TOP + BET1000_HEIGHT },
|
|
{ BETALL_LEFT, BETALL_TOP, BETALL_LEFT + BETALL_WIDTH, BETALL_TOP + BETALL_HEIGHT }
|
|
};
|
|
|
|
|
|
CBmpButton *apHold[5]; // Bitmap buttons for the Hold card buttons
|
|
CBitmap *pHoldButtons = nullptr;
|
|
|
|
static const RECT arHoldRect[5] = {
|
|
{ HOLD1_LEFT, HOLD_TOP, HOLD1_LEFT + HOLD_WIDTH, HOLD_TOP + HOLD_HEIGHT },
|
|
{ HOLD2_LEFT, HOLD_TOP, HOLD2_LEFT + HOLD_WIDTH, HOLD_TOP + HOLD_HEIGHT },
|
|
{ HOLD3_LEFT, HOLD_TOP, HOLD3_LEFT + HOLD_WIDTH, HOLD_TOP + HOLD_HEIGHT },
|
|
{ HOLD4_LEFT, HOLD_TOP, HOLD4_LEFT + HOLD_WIDTH, HOLD_TOP + HOLD_HEIGHT },
|
|
{ HOLD5_LEFT, HOLD_TOP, HOLD5_LEFT + HOLD_WIDTH, HOLD_TOP + HOLD_HEIGHT },
|
|
};
|
|
|
|
CBmpButton *pClearBet = nullptr; // Button for betting Clearing out the bet
|
|
CBmpButton *pDealButton = nullptr; // Button for deal all five cards, starts a hand
|
|
CBmpButton *pDrawButton = nullptr; // Button for drawing cards not held, after initial deal
|
|
|
|
static CSound *pGameSound = nullptr; // Game theme song
|
|
|
|
static const char *sBitmaps[53] = {
|
|
"ART\\PKR1.BMP",
|
|
"ART\\PKR2.BMP",
|
|
"ART\\PKR3.BMP",
|
|
"ART\\PKR4.BMP",
|
|
"ART\\PKR5.BMP",
|
|
"ART\\PKR6.BMP",
|
|
"ART\\PKR7.BMP",
|
|
"ART\\PKR8.BMP",
|
|
"ART\\PKR9.BMP",
|
|
"ART\\PKR10.BMP",
|
|
"ART\\PKR11.BMP",
|
|
"ART\\PKR12.BMP",
|
|
"ART\\PKR13.BMP",
|
|
"ART\\PKR14.BMP",
|
|
"ART\\PKR15.BMP",
|
|
"ART\\PKR16.BMP",
|
|
"ART\\PKR17.BMP",
|
|
"ART\\PKR18.BMP",
|
|
"ART\\PKR19.BMP",
|
|
"ART\\PKR20.BMP",
|
|
"ART\\PKR21.BMP",
|
|
"ART\\PKR22.BMP",
|
|
"ART\\PKR23.BMP",
|
|
"ART\\PKR24.BMP",
|
|
"ART\\PKR25.BMP",
|
|
"ART\\PKR26.BMP",
|
|
"ART\\PKR27.BMP",
|
|
"ART\\PKR28.BMP",
|
|
"ART\\PKR29.BMP",
|
|
"ART\\PKR30.BMP",
|
|
"ART\\PKR31.BMP",
|
|
"ART\\PKR32.BMP",
|
|
"ART\\PKR33.BMP",
|
|
"ART\\PKR34.BMP",
|
|
"ART\\PKR35.BMP",
|
|
"ART\\PKR36.BMP",
|
|
"ART\\PKR37.BMP",
|
|
"ART\\PKR38.BMP",
|
|
"ART\\PKR39.BMP",
|
|
"ART\\PKR40.BMP",
|
|
"ART\\PKR41.BMP",
|
|
"ART\\PKR42.BMP",
|
|
"ART\\PKR43.BMP",
|
|
"ART\\PKR44.BMP",
|
|
"ART\\PKR45.BMP",
|
|
"ART\\PKR46.BMP",
|
|
"ART\\PKR47.BMP",
|
|
"ART\\PKR48.BMP",
|
|
"ART\\PKR49.BMP",
|
|
"ART\\PKR50.BMP",
|
|
"ART\\PKR51.BMP",
|
|
"ART\\PKR52.BMP",
|
|
"ART\\CARDBACK.BMP"
|
|
};
|
|
|
|
int nPayOff;
|
|
bool bFirstTime;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*****************************************************************
|
|
*
|
|
* CMainPokerWindow
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Create the window with the appropriate style, size, menu, etc.;
|
|
* it will be later revealed by CTheApp::InitInstance(). Then
|
|
* create our splash screen object by opening and loading its DIB.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* lUserAmount = initial amount of money that user starts with
|
|
* defaults to zero
|
|
* nRounds = the number of rounds to play, if 0 then not playing rounds
|
|
* = defaults to zero
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
CMainPokerWindow::CMainPokerWindow(HWND hCallingWnd, LPGAMESTRUCT lpGameStruct) :
|
|
NewGameRect(21, 4, 225, 21) {
|
|
CDC *pDC = nullptr; // device context for the screen
|
|
CString WndClass;
|
|
CDibDoc *pDibDoc = nullptr; // pointer to the background art DIB
|
|
CSize mySize;
|
|
int nCounter1;
|
|
bool bTestCreate, // bool for testing the creation of each button
|
|
bTestLoadBmp, // bool for testing the loading of bitmaps
|
|
bTestDibDoc; // bool for testing the creation of the splash screen
|
|
int i;
|
|
CPalette *pOldPal = nullptr;
|
|
|
|
BeginWaitCursor();
|
|
initStatics();
|
|
|
|
// Define a special window class which traps double-clicks, is byte aligned
|
|
// to maximize BITBLT performance, and creates "owned" DCs rather than sharing
|
|
// the five system defined DCs which are not guaranteed to be available;
|
|
// this adds a bit to our app size but avoids hangs/freezes/lockups.
|
|
WndClass = AfxRegisterWndClass(CS_DBLCLKS | CS_BYTEALIGNWINDOW | CS_OWNDC,
|
|
nullptr, nullptr, nullptr);
|
|
|
|
for (nCounter1 = 0; nCounter1 < 10; ++nCounter1) {
|
|
aDealtArray[nCounter1][0] = 0;
|
|
aDealtArray[nCounter1][1] = 0;
|
|
}
|
|
|
|
// initialize private members
|
|
m_lpGameStruct = lpGameStruct;
|
|
|
|
// Make sure user has money before the game starts:
|
|
if (m_lpGameStruct->bPlayingMetagame) {
|
|
m_nRound = NUMBEROFROUNDS;
|
|
m_lStartingAmount = m_lpGameStruct->lCrowns;
|
|
m_lUserAmount = m_lpGameStruct->lCrowns;
|
|
m_bPlayRounds = true;
|
|
} else {
|
|
m_nRound = 0;
|
|
m_lStartingAmount = 1000;
|
|
m_lUserAmount = 1000;
|
|
m_bPlayRounds = false;
|
|
}
|
|
|
|
roundOfPlay = 0;
|
|
m_hCallAppWnd = hCallingWnd;
|
|
m_bPlaySounds = m_lpGameStruct->bSoundEffectsEnabled;
|
|
|
|
m_lUserBet = 0;
|
|
|
|
// load splash screen
|
|
pDC = GetDC(); // get a device context for our window
|
|
|
|
//()FetchBitmap( pDC, &pGamePalette, SPLASHSPEC );
|
|
|
|
|
|
pDibDoc = new CDibDoc(); // create an object to hold our splash screen
|
|
ASSERT(pDibDoc); // ... and verify we got it
|
|
bTestDibDoc = pDibDoc->OpenDocument(SPLASHSPEC); // next load in the actual DIB based artwork
|
|
ASSERT(bTestDibDoc);
|
|
pGamePalette = (*pDibDoc).DetachPalette(); // grab its palette and save it for later use
|
|
delete pDibDoc; // now discard the splash screen
|
|
|
|
// set window coordinates to center game on screeen
|
|
MainRect.left = (pDC->GetDeviceCaps(HORZRES) - GAME_WIDTH) >> 1;
|
|
MainRect.top = (pDC->GetDeviceCaps(VERTRES) - GAME_HEIGHT) >> 1;
|
|
MainRect.right = MainRect.left + GAME_WIDTH; // determine where to place the game window
|
|
MainRect.bottom = MainRect.top + GAME_HEIGHT; // ... so it is centered on the screen
|
|
|
|
ReleaseDC(pDC); // release our window context
|
|
|
|
// Create the window as a POPUP so that no boarders, title, or menu are present;
|
|
// this is because the game's background art will fill the entire 640x40 area.
|
|
Create(WndClass, "Boffo Games -- Poker", WS_POPUP, MainRect, nullptr, 0);
|
|
|
|
ShowWindow(SW_SHOWNORMAL);
|
|
UpdateWindow();
|
|
|
|
// create buttons
|
|
pOptionButton = new CBmpButton; // create the Options button
|
|
ASSERT(pOptionButton);
|
|
OptionRect.SetRect(OPTION_LEFT,
|
|
OPTION_TOP,
|
|
OPTION_LEFT + OPTION_WIDTH,
|
|
OPTION_TOP + OPTION_HEIGHT);
|
|
bTestCreate = pOptionButton->Create(nullptr, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE, OptionRect, this, IDC_OPTION);
|
|
ASSERT(bTestCreate); // test for button's creation
|
|
bTestLoadBmp = pOptionButton->LoadBitmaps((IDB_OPTIONSCROLL),
|
|
(IDB_OPTIONSCROLL),
|
|
(IDB_OPTIONSCROLL),
|
|
(IDB_OPTIONSCROLL));
|
|
ASSERT(bTestLoadBmp); // test for button's bitmap loading
|
|
|
|
pDealButton = new CBmpButton; // create the Deal button
|
|
ASSERT(pDealButton);
|
|
DealRect.SetRect(DEAL_LEFT,
|
|
DEAL_TOP,
|
|
DEAL_LEFT + DEAL_WIDTH,
|
|
DEAL_TOP + DEAL_HEIGHT);
|
|
bTestCreate = pDealButton->Create(nullptr, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE, DealRect, this, IDC_DEAL);
|
|
ASSERT(bTestCreate); // test for button's creation
|
|
bTestLoadBmp = pDealButton->LoadBmpBitmaps(DEALUP, DEALDOWN, nullptr, DEALDISABLED);
|
|
ASSERT(bTestLoadBmp); // test for button's bitmap loading
|
|
|
|
pDrawButton = new CBmpButton; // create the Draw button
|
|
ASSERT(pDrawButton);
|
|
DrawRect.SetRect(DRAW_LEFT,
|
|
DRAW_TOP,
|
|
DRAW_LEFT + DRAW_WIDTH,
|
|
DRAW_TOP + DRAW_HEIGHT);
|
|
bTestCreate = pDrawButton->Create(nullptr, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE, DrawRect, this, IDC_DRAW);
|
|
ASSERT(bTestCreate); // test for button's creation
|
|
bTestLoadBmp = pDrawButton->LoadBmpBitmaps(DRAWUP, DRAWDOWN, nullptr, DRAWDISABLED);
|
|
ASSERT(bTestLoadBmp); // test for button's bitmap loading
|
|
|
|
pDC = nullptr;
|
|
pDC = GetDC();
|
|
pOldPal = pDC->SelectPalette(pGamePalette, false);
|
|
pDC->RealizePalette();
|
|
|
|
pBetButtons = FetchBitmap(pDC, nullptr, BETBUTTONS);
|
|
|
|
for (i = 0; i < 7; i++) {
|
|
|
|
pUpBmp = ExtractBitmap(pDC, pBetButtons, pGamePalette,
|
|
(i * BET_BMP_GRID_WITDH), BET_BMP_GRID_TOP1,
|
|
arDstBet[i].right - arDstBet[i].left,
|
|
arDstBet[i].bottom - arDstBet[i].top);
|
|
pDnBmp = ExtractBitmap(pDC, pBetButtons, pGamePalette,
|
|
(i * BET_BMP_GRID_WITDH), BET_BMP_GRID_TOP2,
|
|
arDstBet[i].right - arDstBet[i].left,
|
|
arDstBet[i].bottom - arDstBet[i].top);
|
|
pDsBmp = ExtractBitmap(pDC, pBetButtons, pGamePalette,
|
|
(i * BET_BMP_GRID_WITDH), BET_BMP_GRID_TOP3,
|
|
arDstBet[i].right - arDstBet[i].left,
|
|
arDstBet[i].bottom - arDstBet[i].top);
|
|
|
|
apBet[i] = nullptr;
|
|
apBet[i] = new CBmpButton; // create the Bet 1 Crown button
|
|
ASSERT(apBet[i] != nullptr);
|
|
|
|
bTestCreate = apBet[i]->Create(nullptr, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE, arDstBet[i], this, IDC_BET1 + i);
|
|
ASSERT(bTestCreate); // test for button's creation
|
|
|
|
bTestLoadBmp = apBet[i]->LoadBitmaps(pGamePalette, pUpBmp, pDnBmp, nullptr, pDsBmp);
|
|
ASSERT(bTestLoadBmp); // test for button's bitmap loading
|
|
|
|
pUpBmp = nullptr;
|
|
pDnBmp = nullptr;
|
|
pDsBmp = nullptr;
|
|
pBtnPalette = nullptr;
|
|
}
|
|
|
|
pHoldButtons = FetchBitmap(pDC, nullptr, HOLDBUTTONS);
|
|
|
|
for (i = 0; i < 5; i++) {
|
|
|
|
arCardRect[i].SetRect(CARD_LEFT + (i * CARD_OFFSET) - 1, CARD_TOP - 1,
|
|
CARD_LEFT + CARD_WIDTH + (i * CARD_OFFSET) - 1, CARD_TOP + CARD_HEIGHT - 1);
|
|
apCard[i] = nullptr;
|
|
|
|
pUpBmp = ExtractBitmap(pDC, pHoldButtons, pGamePalette,
|
|
(i * HOLD_BMP_GRID_WITDH), HOLD_BMP_GRID_TOP2,
|
|
arHoldRect[i].right - arHoldRect[i].left,
|
|
arHoldRect[i].bottom - arHoldRect[i].top);
|
|
pDnBmp = ExtractBitmap(pDC, pHoldButtons, pGamePalette,
|
|
(i * HOLD_BMP_GRID_WITDH), HOLD_BMP_GRID_TOP3,
|
|
arHoldRect[i].right - arHoldRect[i].left,
|
|
arHoldRect[i].bottom - arHoldRect[i].top);
|
|
pDsBmp = ExtractBitmap(pDC, pHoldButtons, pGamePalette,
|
|
(i * HOLD_BMP_GRID_WITDH), HOLD_BMP_GRID_TOP4,
|
|
arHoldRect[i].right - arHoldRect[i].left,
|
|
arHoldRect[i].bottom - arHoldRect[i].top);
|
|
|
|
apHold[i] = nullptr;
|
|
apHold[i] = new CBmpButton; // create the Bet 1 Crown button
|
|
ASSERT(apHold[i] != nullptr);
|
|
|
|
bTestCreate = apHold[i]->Create(nullptr, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE, arHoldRect[i], this, (IDC_HOLD1 + i));
|
|
ASSERT(bTestCreate); // test for button's creation
|
|
|
|
bTestLoadBmp = apHold[i]->LoadBitmaps(pGamePalette, pUpBmp, pDnBmp, nullptr, pDsBmp);
|
|
ASSERT(bTestLoadBmp); // test for button's bitmap loading
|
|
|
|
pUpBmp = nullptr;
|
|
pDnBmp = nullptr;
|
|
pDsBmp = nullptr;
|
|
pBtnPalette = nullptr;
|
|
}
|
|
|
|
pDC->SelectPalette(pOldPal, false);
|
|
pDC->RealizePalette();
|
|
pOldPal = nullptr;
|
|
ReleaseDC(pDC);
|
|
|
|
pClearBet = new CBmpButton; // create the Clear Bet button
|
|
ASSERT(pClearBet);
|
|
ClearBetRect.SetRect(CLEARBET_LEFT,
|
|
CLEARBET_TOP,
|
|
CLEARBET_LEFT + CLEARBET_WIDTH,
|
|
CLEARBET_TOP + CLEARBET_HEIGHT);
|
|
bTestCreate = pClearBet->Create(nullptr, BS_OWNERDRAW | WS_CHILD | WS_VISIBLE, ClearBetRect, this, IDC_CLEARBET);
|
|
ASSERT(bTestCreate); // test for button's creation
|
|
bTestLoadBmp = pClearBet->LoadBmpBitmaps(CLEARBETUP, CLEARBETDOWN, nullptr, CLEARBETDISABLED);
|
|
ASSERT(bTestLoadBmp); // test for button's bitmap loading
|
|
|
|
// initialize payoffs to Poporrean
|
|
m_nPayOffRoyalFlush = 500;
|
|
m_nPayOffStraightFlush = 100;
|
|
m_nPayOffFourofaKind = 50;
|
|
m_nPayOffFullHouse = 15;
|
|
m_nPayOffFlush = 10;
|
|
m_nPayOffStraight = 8;
|
|
m_nPayOffThreeofaKind = 5;
|
|
m_nPayOffTwoPair = 3;
|
|
m_nPayOffPairJackorHigher = 2;
|
|
m_nPayOffPair = 1;
|
|
nPayOff = IDC_POPO;
|
|
|
|
// initialize BOOLS
|
|
m_bMiddleOfHand = false;
|
|
m_bMouseCaptured = false;
|
|
m_bEndHand = true;
|
|
|
|
if (m_lpGameStruct->bMusicEnabled) {
|
|
pGameSound = new CSound(this, GAME_THEME,
|
|
SOUND_MIDI | SOUND_LOOP | SOUND_DONT_LOOP_TO_END);
|
|
if (pGameSound != nullptr)
|
|
(*pGameSound).midiLoopPlaySegment(6370, 33000, 0, FMT_MILLISEC);
|
|
} // end if pGameSound
|
|
|
|
bFirstTime = true;
|
|
|
|
EndWaitCursor();
|
|
|
|
}
|
|
|
|
void CMainPokerWindow::initStatics() {
|
|
pGamePalette = nullptr;
|
|
pBtnPalette = nullptr;
|
|
pOptionButton = nullptr;
|
|
|
|
roundOfPlay = 0;
|
|
Common::fill(apCard, apCard + 5, nullptr);
|
|
pBetButtons = nullptr;
|
|
Common::fill(apBet, apBet + 7, nullptr);
|
|
pUpBmp = nullptr;
|
|
pDnBmp = nullptr;
|
|
pDsBmp = nullptr;
|
|
|
|
Common::fill(apHold, apHold + 5, nullptr);
|
|
pHoldButtons = nullptr;
|
|
|
|
pClearBet = nullptr;
|
|
pDealButton = nullptr;
|
|
pDrawButton = nullptr;
|
|
|
|
pGameSound = nullptr;
|
|
nPayOff = 0;
|
|
bFirstTime = false;
|
|
}
|
|
|
|
/*****************************************************************
|
|
*
|
|
* EnableBets
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Enables and disables the Bet buttons dependent upon if the user
|
|
* has that much to bet
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* UserAmount
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
void CMainPokerWindow::EnableBets() {
|
|
|
|
// if not in Round play or have played less than m_nRound rounds
|
|
if ((m_bPlayRounds == false) || (roundOfPlay < m_nRound)) {
|
|
// disable/enable Bet buttons accoringly
|
|
|
|
if (m_lUserAmount >= 1) {
|
|
apBet[0]->EnableWindow(true);
|
|
apBet[6]->EnableWindow(true);
|
|
} else {
|
|
apBet[0]->EnableWindow(false);
|
|
apBet[6]->EnableWindow(false);
|
|
}
|
|
|
|
if (m_lUserAmount >= 5)
|
|
apBet[1]->EnableWindow(true);
|
|
else
|
|
apBet[1]->EnableWindow(false);
|
|
|
|
if (m_lUserAmount >= 10)
|
|
apBet[2]->EnableWindow(true);
|
|
else
|
|
apBet[2]->EnableWindow(false);
|
|
|
|
if (m_lUserAmount >= 25)
|
|
apBet[3]->EnableWindow(true);
|
|
else
|
|
apBet[3]->EnableWindow(false);
|
|
|
|
if (m_lUserAmount >= 100)
|
|
apBet[4]->EnableWindow(true);
|
|
else
|
|
apBet[4]->EnableWindow(false);
|
|
|
|
if (m_lUserAmount >= 1000)
|
|
apBet[5]->EnableWindow(true);
|
|
else
|
|
apBet[5]->EnableWindow(false);
|
|
|
|
if (m_lUserBet > 0)
|
|
pClearBet->EnableWindow(true);
|
|
else
|
|
pClearBet->EnableWindow(false);
|
|
|
|
if (m_lUserBet >= MAXBET) {
|
|
apBet[0]->EnableWindow(false);
|
|
apBet[1]->EnableWindow(false);
|
|
apBet[2]->EnableWindow(false);
|
|
apBet[3]->EnableWindow(false);
|
|
apBet[4]->EnableWindow(false);
|
|
apBet[5]->EnableWindow(false);
|
|
apBet[6]->EnableWindow(false);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
/*****************************************************************
|
|
*
|
|
* OnPaint
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Repaint the screen whenever needed; e.g. when uncovered by an
|
|
* overlapping window, when maximized from an icon, and when it the
|
|
* window is initially created. Ensures that the entire client area
|
|
* of the main screen window is repainted, not just the portion in the
|
|
* update region; see SplashScreen();
|
|
*
|
|
* This routine is called whenever Windows sends a WM_PAINT message.
|
|
* Note that creating a CPaintDC automatically does a BeginPaint and
|
|
* an EndPaint call is done when it is destroyed at the end of this
|
|
* function. CPaintDC's constructor needs the window (this).
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
void CMainPokerWindow::OnPaint() {
|
|
PAINTSTRUCT lpPaint;
|
|
|
|
BeginPaint(&lpPaint); // bracket start of window update
|
|
SplashScreen(); // repaint our window's content
|
|
EndPaint(&lpPaint); // bracket end of window update
|
|
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
*
|
|
* SplashScreen
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Repaint the background artwork, together with all sprites in the
|
|
* sprite chain queue. The entire window is redrawn, rather than just
|
|
* the updated area, to ensure that the sprites end up with the correct
|
|
* background bitmaps saved for their image areas.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
void CMainPokerWindow::SplashScreen() {
|
|
CRect rcDest; // defines where the art gets painted
|
|
CRect rcDIB; // defines where the art comes from
|
|
CDC *pDC; // pointer to the window device context
|
|
CDibDoc myDoc; // contains the artwork's DIB information
|
|
HDIB hDIB; // a handle to the DIB itself
|
|
char cBet[7]; // empty strings for displaying the user's bet
|
|
char cUser[12]; // empty strings for displaying the user's amount
|
|
// COLORREF clrOldColorRef; // a place holder for the old text color in the DC
|
|
// int nOldBkMode; // a place holder for the old Background Mode in the DC
|
|
bool bTestDibDoc; // a bool for testing the return on DibDoc
|
|
|
|
char cUserDisplay[32]; // the character array to display for the user's amount
|
|
char cBetDisplay[12]; // the character array to display for the bet amount
|
|
int nCharIndex; // keeps track of the current element in the old array
|
|
int nDisplayIndex; // keeps track of the current element in the new array
|
|
int nCounter1; // counter
|
|
int i, j;
|
|
CText *ptxtUserDisplay = nullptr;
|
|
CText *ptxtBetDisplay = nullptr;
|
|
CRect rectDisplayUser;
|
|
CRect rectDisplayBet;
|
|
|
|
bTestDibDoc = myDoc.OpenDocument(SPLASHSPEC);
|
|
ASSERT(bTestDibDoc);
|
|
|
|
hDIB = myDoc.GetHDIB(); // ... get a handle to its DIB
|
|
ASSERT(hDIB);
|
|
|
|
pDC = GetDC(); // get a device context for the window
|
|
ASSERT(pDC);
|
|
|
|
GetClientRect(rcDest); // get the rectangle to where we paint
|
|
|
|
int cxDIB = (int) DIBWidth(hDIB);
|
|
int cyDIB = (int) DIBHeight(hDIB);
|
|
|
|
rcDIB.top = rcDIB.left = 0; // setup the source rectangle from which
|
|
rcDIB.right = cxDIB; // ... we'll do the painting
|
|
rcDIB.bottom = cyDIB;
|
|
PaintDIB((*pDC).m_hDC, &rcDest, hDIB, &rcDIB, pGamePalette); // transfer the image to the screen
|
|
|
|
rectDisplayUser.SetRect(USER_AMOUNT_X, USER_AMOUNT_Y, USER_AMOUNT_X + AMOUNT_WIDTH, USER_AMOUNT_Y + AMOUNT_HEIGHT);
|
|
rectDisplayBet.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + AMOUNT_WIDTH, POT_AMOUNT_Y + AMOUNT_HEIGHT);
|
|
|
|
ptxtUserDisplay = new CText;
|
|
ptxtBetDisplay = new CText;
|
|
|
|
// create the display strings for the bet and user amount
|
|
Common::sprintf_s((char *)cBet, 10, "%li", m_lUserBet);
|
|
Common::sprintf_s((char *)cUser, 10, "%li", m_lUserAmount);
|
|
|
|
j = 0;
|
|
for (nCharIndex = strlen((char *)cUser) - 1, nDisplayIndex = nCharIndex + (nCharIndex / 3), nCounter1 = 1;
|
|
nCharIndex >= 0;
|
|
nCharIndex--, nDisplayIndex--, nCounter1++) {
|
|
|
|
if ((nCounter1 % 4) == 0) {
|
|
cUserDisplay[nDisplayIndex] = ',';
|
|
nCharIndex++;
|
|
j++;
|
|
} else {
|
|
cUserDisplay[nDisplayIndex] = cUser[nCharIndex];
|
|
}
|
|
}
|
|
nDisplayIndex = strlen((char *)cUser);
|
|
cUserDisplay[nDisplayIndex + j] = 0;
|
|
|
|
ptxtUserDisplay->SetupText(pDC, pGamePalette, &rectDisplayUser, JUSTIFY_CENTER);
|
|
ptxtUserDisplay->DisplayString(pDC, cUserDisplay, 16, FW_BOLD, (COLORREF)RGB(0, 0, 255));
|
|
|
|
for (nCharIndex = strlen((char *)cBet) - 1, nDisplayIndex = nCharIndex + (nCharIndex / 3), nCounter1 = 1;
|
|
nCharIndex >= 0;
|
|
nCharIndex--, nDisplayIndex--, nCounter1++) {
|
|
|
|
if ((nCounter1 % 4) == 0) {
|
|
cBetDisplay[nDisplayIndex] = ',';
|
|
nCharIndex++;
|
|
} else {
|
|
cBetDisplay[nDisplayIndex] = cBet[nCharIndex];
|
|
}
|
|
}
|
|
nDisplayIndex = strlen((char *)cBet);
|
|
cBetDisplay[nDisplayIndex + (nDisplayIndex / 4)] = 0;
|
|
|
|
ptxtBetDisplay->SetupText(pDC, pGamePalette, &rectDisplayBet, JUSTIFY_CENTER);
|
|
ptxtBetDisplay->DisplayString(pDC, cBetDisplay, 16, FW_BOLD, RGB(0, 0, 255));
|
|
|
|
for (i = 0; i < 5; i++) {
|
|
CPoint ptTemp(arCardRect[i].left + 1, arCardRect[i].top + 1);
|
|
|
|
if (apCard[i] != nullptr)
|
|
apCard[i]->PaintSprite(pDC, ptTemp.x, ptTemp.y);
|
|
}
|
|
|
|
ReleaseDC(pDC); // release the window's context
|
|
delete ptxtUserDisplay;
|
|
delete ptxtBetDisplay;
|
|
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
*
|
|
* ResetGame
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Start a new game, and reset all arrays and buttons
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* aDealtArray, apHold
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
void CMainPokerWindow::ResetGame(long lAmount) {
|
|
int nLoop;
|
|
CDC *pDC = nullptr;
|
|
|
|
// set arrays to 0
|
|
for (nLoop = 0; nLoop < 10; ++nLoop) {
|
|
aDealtArray[nLoop][0] = 0;
|
|
aDealtArray[nLoop][1] = 0;
|
|
}
|
|
for (nLoop = 0; nLoop < 5; ++nLoop) {
|
|
apHold[nLoop]->EnableWindow(false);
|
|
if (bFirstTime == false) {
|
|
abHoldArray[nLoop] = true;
|
|
SetHoldList(nLoop);
|
|
} else {
|
|
abHoldArray[nLoop] = false;
|
|
}
|
|
}
|
|
|
|
if (bFirstTime)
|
|
bFirstTime = false;
|
|
|
|
// disable deal and draw buttons
|
|
pDealButton->EnableWindow(false);
|
|
pDrawButton->EnableWindow(false);
|
|
|
|
// clear out any bet
|
|
if (lAmount == 0L)
|
|
SetBet(-1);
|
|
else {
|
|
m_lUserAmount = lAmount;
|
|
m_lUserBet = 0L;
|
|
SetBet(0);
|
|
}
|
|
for (nLoop = 0; nLoop < 5; ++nLoop) {
|
|
|
|
if (apCard[nLoop] != nullptr) {
|
|
pDC = GetDC();
|
|
apCard[nLoop]->EraseSprite(pDC);
|
|
delete apCard[nLoop];
|
|
apCard[nLoop] = nullptr;
|
|
ReleaseDC(pDC);
|
|
}
|
|
|
|
}
|
|
return;
|
|
}
|
|
|
|
/*****************************************************************
|
|
*
|
|
* OnCommand
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Process the QUIT and OKAY buttons when they are clicked.
|
|
*
|
|
* This function is called when a WM_COMMAND message is issued,
|
|
* typically in order to process control related activities.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* wParam identifier for the button to be processed
|
|
* lParam type of message to be processed
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
// OnCommand
|
|
//
|
|
void CALLBACK lpfnOptionCallback(CWnd * pWnd) { // do the mini options dialog
|
|
int nOption = 0; // return from the Options dialog
|
|
int nSetAmount = 0; // return from the Set User Amount dialog
|
|
int nSetPayOff = 0; // return from the Set Payoffs dialog
|
|
// unsigned int x = IDD_MINIOPTIONS_DIALOG;
|
|
|
|
COptionsDlg dlgOptions(pWnd, pGamePalette, IDD_OPTIONS);
|
|
CSetAmountDlg dlgSetAmt(pWnd, pGamePalette, IDD_SETAMOUNT);
|
|
CSetPayoffsDlg dlgPayOff(pWnd, pGamePalette, IDD_WINRATIO, nPayOff);
|
|
|
|
dlgOptions.SetInitialOptions((pcwndPoker->m_bMiddleOfHand || pcwndPoker->m_bPlayRounds),
|
|
pcwndPoker->m_bPlaySounds);
|
|
|
|
nOption = dlgOptions.DoModal();
|
|
|
|
switch (nOption) {
|
|
|
|
case ID_SETPAYOFFS: // if Winning Ratio's button was hit, popup the Payoff dialog
|
|
(*pWnd).UpdateWindow();
|
|
nSetPayOff = dlgPayOff.DoModal();
|
|
nPayOff = nSetPayOff;
|
|
pcwndPoker->SetPayOffs(nSetPayOff); // the return is what set of payoffs was selected was clicked
|
|
pcwndPoker->FlagResetGame();
|
|
break;
|
|
|
|
case ID_SETUSERAMT: // if Set Amount button was hit, popup the Set Amount dialog
|
|
dlgSetAmt.SetInitialOptions(pcwndPoker->m_lUserAmount);
|
|
(*pWnd).UpdateWindow();
|
|
nSetAmount = dlgSetAmt.DoModal();
|
|
if (nSetAmount != 0) { // the return is what the amount was set to, set m_lUserAmount to it
|
|
pcwndPoker->m_lUserAmount = nSetAmount;
|
|
pcwndPoker->m_lStartingAmount = nSetAmount;
|
|
}
|
|
pcwndPoker->FlagResetGame();
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
bool CMainPokerWindow::OnCommand(WPARAM wParam, LPARAM lParam) {
|
|
int nHoldLoop, nLoop1; // loop variables
|
|
int nMainOption = 0; // return from the Options dialog
|
|
CMainMenu dlgMainOpts((CWnd *)this, pGamePalette,
|
|
(m_lpGameStruct->bPlayingMetagame ? (NO_NEWGAME | NO_OPTIONS) : 0),
|
|
lpfnOptionCallback, RULESFILE,
|
|
(m_lpGameStruct->bSoundEffectsEnabled ? RULES_WAV : nullptr), m_lpGameStruct);
|
|
|
|
CDC *pDC = nullptr;
|
|
int nTemp = 0;
|
|
|
|
if (HIWORD(lParam) == BN_CLICKED) // only want to look at button clicks
|
|
switch (wParam) {
|
|
|
|
case IDC_OPTION: // Option button clicked, then put up the Options dialog
|
|
pOptionButton->ShowWindow(SW_HIDE);
|
|
CSound::waitWaveSounds();
|
|
sndPlaySound(nullptr, 0);
|
|
_flagResetGame = false;
|
|
|
|
nMainOption = dlgMainOpts.DoModal();
|
|
|
|
// If the minigame options were changed, we need to reset the game
|
|
if (_flagResetGame && nMainOption == IDC_OPTIONS_RETURN)
|
|
nMainOption = IDC_OPTIONS_NEWGAME;
|
|
_flagResetGame = false;
|
|
|
|
switch (nMainOption) {
|
|
case IDC_OPTIONS_QUIT: // if Quit buttons was hit, quit
|
|
PostMessage(WM_CLOSE, 0, 0);
|
|
break;
|
|
|
|
case IDC_OPTIONS_NEWGAME: // reset the game and start a new hand
|
|
if ((m_bPlayRounds == false) && (m_bMiddleOfHand == false)) {
|
|
ResetGame(m_lStartingAmount);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
m_bPlaySounds = m_lpGameStruct->bSoundEffectsEnabled;
|
|
if (m_lpGameStruct->bMusicEnabled) {
|
|
if (pGameSound == nullptr) {
|
|
pGameSound = new CSound(this, GAME_THEME,
|
|
SOUND_MIDI | SOUND_LOOP | SOUND_DONT_LOOP_TO_END);
|
|
if (pGameSound != nullptr)
|
|
(*pGameSound).midiLoopPlaySegment(6370, 33000, 0, FMT_MILLISEC);
|
|
}
|
|
} // end if pGameSound
|
|
else {
|
|
if (pGameSound != nullptr) {
|
|
pGameSound->stop();
|
|
delete pGameSound;
|
|
pGameSound = nullptr;
|
|
}
|
|
}
|
|
pOptionButton->ShowWindow(SW_SHOWNORMAL);
|
|
EnableBets();
|
|
for (nTemp = 0; nTemp < 7; nTemp++) {
|
|
apBet[nTemp]->RedrawWindow();
|
|
}
|
|
// PostMessage( WM_COMMAND, wParam, lParam);
|
|
break;
|
|
|
|
// if the Hols buttons are hit then set then accordingly
|
|
case IDC_HOLD1:
|
|
SetHoldList(0);
|
|
break;
|
|
|
|
case IDC_HOLD2:
|
|
SetHoldList(1);
|
|
break;
|
|
|
|
case IDC_HOLD3:
|
|
SetHoldList(2);
|
|
break;
|
|
|
|
case IDC_HOLD4:
|
|
SetHoldList(3);
|
|
break;
|
|
|
|
case IDC_HOLD5:
|
|
SetHoldList(4);
|
|
break;
|
|
|
|
// the Draw button is hit
|
|
case IDC_DRAW:
|
|
|
|
m_bMiddleOfHand = false;
|
|
|
|
// increment the number of rounds
|
|
roundOfPlay++;
|
|
// for all cards not held, draw a new card
|
|
for (nHoldLoop = 0; nHoldLoop < 5; ++nHoldLoop) {
|
|
if (abHoldArray[nHoldLoop] == false) {
|
|
ShowNewCard(DealNewCard(), nHoldLoop);
|
|
aDealtArray[nHoldLoop][1] = 0;
|
|
}
|
|
}
|
|
// check to see if the hand won
|
|
CheckWinningHand();
|
|
m_bEndHand = true;
|
|
for (nLoop1 = 0; nLoop1 < 5; ++nLoop1) {
|
|
|
|
pDC = GetDC();
|
|
apCard[nLoop1]->EraseSprite(pDC);
|
|
delete apCard[nLoop1];
|
|
apCard[nLoop1] = nullptr;
|
|
|
|
ReleaseDC(pDC);
|
|
|
|
}
|
|
// reset all arrays and buttons and start a new hand
|
|
for (nLoop1 = 0; nLoop1 < 10; ++nLoop1) {
|
|
aDealtArray[nLoop1][0] = 0;
|
|
aDealtArray[nLoop1][1] = 0;
|
|
}
|
|
|
|
pDealButton->EnableWindow(false);
|
|
pDrawButton->EnableWindow(false);
|
|
for (nHoldLoop = 0; nHoldLoop < 5; ++nHoldLoop) {
|
|
apHold[nHoldLoop]->EnableWindow(false);
|
|
abHoldArray[nHoldLoop] = true;
|
|
SetHoldList(nHoldLoop);
|
|
}
|
|
|
|
if ((m_lpGameStruct->bPlayingMetagame) && (m_lUserAmount == 0)) {
|
|
C1ButtonDialog cMsgBox((CWnd *)this, pGamePalette, "&Okay", "You Lose.", "You have 0", "crowns left.");
|
|
cMsgBox.DoModal();
|
|
PostMessage(WM_CLOSE);
|
|
} else {
|
|
SetBet(0);
|
|
if (m_lpGameStruct->bPlayingMetagame) {
|
|
if (roundOfPlay >= m_nRound) {
|
|
CMessageBox cMsgBox((CWnd *)this, pGamePalette, "Your 4 rounds", "are over.");
|
|
PostMessage(WM_CLOSE);
|
|
}
|
|
}
|
|
}
|
|
break; // ... to force a repaint
|
|
|
|
// the Deal button is hit
|
|
case IDC_DEAL:
|
|
|
|
m_bMiddleOfHand = true;
|
|
// make sure that the Dealt array is reset
|
|
for (nLoop1 = 0; nLoop1 < 10; ++nLoop1) {
|
|
aDealtArray[nLoop1][0] = 0;
|
|
aDealtArray[nLoop1][1] = 0;
|
|
}
|
|
|
|
// for all 5 cards shown deal a new card
|
|
for (nLoop1 = 0; nLoop1 < 5; ++nLoop1)
|
|
ShowNewCard(DealNewCard(), nLoop1);
|
|
|
|
// enable the Draw, and Hold buttons
|
|
pDrawButton->EnableWindow(true);
|
|
for (nHoldLoop = 0; nHoldLoop < 5; ++nHoldLoop)
|
|
apHold[nHoldLoop]->EnableWindow(true);
|
|
|
|
// disable all other buttons
|
|
pDealButton->EnableWindow(false);
|
|
|
|
apBet[0]->EnableWindow(false);
|
|
apBet[1]->EnableWindow(false);
|
|
apBet[2]->EnableWindow(false);
|
|
apBet[3]->EnableWindow(false);
|
|
apBet[4]->EnableWindow(false);
|
|
apBet[5]->EnableWindow(false);
|
|
apBet[6]->EnableWindow(false);
|
|
|
|
pClearBet->EnableWindow(false);
|
|
break;
|
|
|
|
// if the Bet buttons are hit then set the bet accordingly
|
|
case IDC_BET1:
|
|
SetBet(1);
|
|
pDealButton->EnableWindow(true);
|
|
break;
|
|
case IDC_BET5:
|
|
SetBet(5);
|
|
pDealButton->EnableWindow(true);
|
|
break;
|
|
case IDC_BET10:
|
|
SetBet(10);
|
|
pDealButton->EnableWindow(true);
|
|
break;
|
|
case IDC_BET25:
|
|
SetBet(25);
|
|
pDealButton->EnableWindow(true);
|
|
break;
|
|
case IDC_BET100:
|
|
SetBet(100);
|
|
pDealButton->EnableWindow(true);
|
|
break;
|
|
case IDC_BET1000:
|
|
SetBet(1000);
|
|
pDealButton->EnableWindow(true);
|
|
break;
|
|
case IDC_BETALL:
|
|
SetBet(min(m_lUserAmount, (long)MAXBET));
|
|
pDealButton->EnableWindow(true);
|
|
break;
|
|
case IDC_CLEARBET:
|
|
if (m_lpGameStruct->bSoundEffectsEnabled) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_CLEAR, SND_ASYNC);
|
|
}
|
|
SetBet(-1);
|
|
pDealButton->EnableWindow(false);
|
|
break;
|
|
}
|
|
|
|
|
|
(*this).SetFocus(); // Reset focus back to the main window
|
|
return true;
|
|
}
|
|
|
|
void CMainPokerWindow::OnRButtonDown(unsigned int nFlags, CPoint point) {
|
|
CSetPayoffsDlg dlgPayOff((CWnd *)this, pGamePalette, IDD_WINRATIO, nPayOff, true);
|
|
|
|
dlgPayOff.DoModal();
|
|
|
|
CWnd::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
void CMainPokerWindow::OnLButtonDown(unsigned int nFlags, CPoint point) {
|
|
CDC *pDC;
|
|
CRect rClock,
|
|
rBoom,
|
|
rPencil,
|
|
rChair,
|
|
rWindow,
|
|
rLight;
|
|
CSprite *pSprite = nullptr;
|
|
CSound *pEffect = nullptr;
|
|
bool bSuccess;
|
|
int i;
|
|
|
|
|
|
rClock.SetRect(CLOCK_X, CLOCK_Y, CLOCK_X + CLOCK_DX, CLOCK_Y + CLOCK_DY);
|
|
rBoom.SetRect(BOOM_X, BOOM_Y, BOOM_X + BOOM_DX, BOOM_Y + BOOM_DY);
|
|
rPencil.SetRect(PENCIL_X, PENCIL_Y, PENCIL_X + PENCIL_DX, PENCIL_Y + PENCIL_DY);
|
|
rChair.SetRect(CHAIR_X, CHAIR_Y, CHAIR_X + CHAIR_DX, CHAIR_Y + CHAIR_DY);
|
|
rWindow.SetRect(WINDOW_X, WINDOW_Y, WINDOW_X + WINDOW_DX, WINDOW_Y + WINDOW_DY);
|
|
rLight.SetRect(LIGHT_X, LIGHT_Y, LIGHT_X + LIGHT_DX, LIGHT_Y + LIGHT_DY);
|
|
|
|
pDC = GetDC();
|
|
|
|
if (NewGameRect.PtInRect(point) && !m_lpGameStruct->bPlayingMetagame) {
|
|
SetCapture();
|
|
m_bMouseCaptured = true;
|
|
} else if (rClock.PtInRect(point)) {
|
|
CSound::waitWaveSounds();
|
|
sndPlaySound(nullptr, 0);
|
|
PlayEasterEgg(pDC, (CWnd *)this, pGamePalette, CLOCK_ANIM, WAV_CLOCK, CLOCK_FRAMES,
|
|
CLOCK_X, CLOCK_Y, CLOCK_SLEEP, m_bPlaySounds);
|
|
} else if (rBoom.PtInRect(point)) {
|
|
pSprite = new CSprite;
|
|
(*pSprite).SharePalette(pGamePalette);
|
|
bSuccess = (*pSprite).LoadCels(pDC, BOOM_ANIM, BOOM_FRAMES);
|
|
if (!bSuccess) {
|
|
delete pSprite;
|
|
return;
|
|
}
|
|
(*pSprite).SetMasked(false);
|
|
(*pSprite).SetMobile(false);
|
|
|
|
CSound::waitWaveSounds();
|
|
sndPlaySound(nullptr, 0);
|
|
|
|
if (m_bPlaySounds) {
|
|
pEffect = new CSound((CWnd *)this, WAV_BOOM, // Load up the sound file as a
|
|
SOUND_WAVE | SOUND_ASYNCH | SOUND_QUEUE | SOUND_AUTODELETE); //...Wave file, to delete itself
|
|
}
|
|
if (pEffect != nullptr) {
|
|
bSuccess = (*pEffect).play();
|
|
if (!bSuccess)
|
|
delete pEffect;
|
|
}
|
|
(*pSprite).SetCel(BOOM_FRAMES);
|
|
for (i = 0; i < 13; i++) {
|
|
(*pSprite).PaintSprite(pDC, BOOM_X, BOOM_Y);
|
|
Sleep(BOOM_SLEEP);
|
|
}
|
|
|
|
if (m_bPlaySounds) {
|
|
pEffect = new CSound((CWnd *)this, WAV_STAR, // Load up the sound file as a
|
|
SOUND_WAVE | SOUND_ASYNCH | SOUND_QUEUE | SOUND_AUTODELETE); //...Wave file, to delete itself
|
|
}
|
|
if (pEffect != nullptr) {
|
|
bSuccess = (*pEffect).play();
|
|
if (!bSuccess)
|
|
delete pEffect;
|
|
}
|
|
// (*pSprite).SetCel( nNumCels );
|
|
while (i < BOOM_FRAMES) {
|
|
(*pSprite).PaintSprite(pDC, BOOM_X, BOOM_Y);
|
|
Sleep(BOOM_SLEEP);
|
|
i++;
|
|
}
|
|
|
|
delete pSprite;
|
|
|
|
} else if (rPencil.PtInRect(point) && m_lpGameStruct->bSoundEffectsEnabled) {
|
|
CSound::waitWaveSounds();
|
|
sndPlaySound(nullptr, 0);
|
|
if (m_bPlaySounds) {
|
|
pEffect = new CSound((CWnd *)this, WAV_PENCIL, // Load up the sound file as a
|
|
SOUND_WAVE | SOUND_ASYNCH | SOUND_QUEUE | SOUND_AUTODELETE); //...Wave file, to delete itself
|
|
}
|
|
if (pEffect != nullptr) {
|
|
bSuccess = (*pEffect).play();
|
|
if (!bSuccess)
|
|
delete pEffect;
|
|
}
|
|
// sndPlaySound( WAV_PENCIL, SND_ASYNC );
|
|
} else if (rChair.PtInRect(point) && m_lpGameStruct->bSoundEffectsEnabled) {
|
|
CSound::waitWaveSounds();
|
|
sndPlaySound(nullptr, 0);
|
|
if (m_bPlaySounds) {
|
|
pEffect = new CSound((CWnd *)this, WAV_CHAIR, // Load up the sound file as a
|
|
SOUND_WAVE | SOUND_ASYNCH | SOUND_QUEUE | SOUND_AUTODELETE); //...Wave file, to delete itself
|
|
}
|
|
if (pEffect != nullptr) {
|
|
bSuccess = (*pEffect).play();
|
|
if (!bSuccess)
|
|
delete pEffect;
|
|
}
|
|
// sndPlaySound( WAV_CHAIR, SND_ASYNC );
|
|
} else if (rWindow.PtInRect(point) && m_lpGameStruct->bSoundEffectsEnabled) {
|
|
CSound::waitWaveSounds();
|
|
sndPlaySound(nullptr, 0);
|
|
if (m_bPlaySounds) {
|
|
pEffect = new CSound((CWnd *)this, WAV_WINDOW, // Load up the sound file as a
|
|
SOUND_WAVE | SOUND_ASYNCH | SOUND_QUEUE | SOUND_AUTODELETE); //...Wave file, to delete itself
|
|
}
|
|
if (pEffect != nullptr) {
|
|
bSuccess = (*pEffect).play();
|
|
if (!bSuccess)
|
|
delete pEffect;
|
|
}
|
|
// sndPlaySound( WAV_WINDOW, SND_ASYNC );
|
|
} else if (rLight.PtInRect(point) && m_lpGameStruct->bSoundEffectsEnabled) {
|
|
CSound::waitWaveSounds();
|
|
sndPlaySound(nullptr, 0);
|
|
if (m_bPlaySounds) {
|
|
pEffect = new CSound((CWnd *)this, WAV_LIGHT, // Load up the sound file as a
|
|
SOUND_WAVE | SOUND_ASYNCH | SOUND_QUEUE | SOUND_AUTODELETE); //...Wave file, to delete itself
|
|
}
|
|
if (pEffect != nullptr) {
|
|
bSuccess = (*pEffect).play();
|
|
if (!bSuccess)
|
|
delete pEffect;
|
|
}
|
|
// sndPlaySound( WAV_LIGHT, SND_ASYNC );
|
|
}
|
|
|
|
ReleaseDC(pDC);
|
|
|
|
CWnd::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
void CMainPokerWindow::OnLButtonUp(unsigned int nFlags, CPoint point) {
|
|
if (m_bMouseCaptured) {
|
|
m_bMouseCaptured = false;
|
|
ReleaseCapture();
|
|
if (NewGameRect.PtInRect(point) && !m_lpGameStruct->bPlayingMetagame)
|
|
ResetGame(m_lStartingAmount);
|
|
}
|
|
CWnd::OnLButtonUp(nFlags, point);
|
|
}
|
|
|
|
void CMainPokerWindow::OnKeyDown(unsigned int nChar, unsigned int nRepCnt, unsigned int nFlags) {
|
|
CRules dlgRules((CWnd *)this, RULESFILE, pGamePalette,
|
|
(m_lpGameStruct->bSoundEffectsEnabled ? RULES_WAV : nullptr));
|
|
|
|
if (nChar == VK_F1) {
|
|
pOptionButton->ShowWindow(SW_HIDE);
|
|
// UpdateWindow();
|
|
dlgRules.DoModal(); // invoke the help dialog box
|
|
pOptionButton->ShowWindow(SW_SHOWNORMAL);
|
|
return;
|
|
} else {
|
|
if (nChar == VK_F2) {
|
|
SendMessage(WM_COMMAND, IDC_OPTION, BN_CLICKED);
|
|
return;
|
|
}
|
|
}
|
|
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
/*****************************************************************
|
|
*
|
|
* SetPayOffs
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Sets the PayOff Ratios
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* nPayOffType = what set of payoffs to use, this corresponds
|
|
* to exactly the same set of odds as displayed
|
|
* in the "Set Payoffs" dialog
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* m_nPayOffPair
|
|
* m_nPayOffPairJackorHigher
|
|
* m_nPayOffTwoPair
|
|
* m_nPayOffThreeofaKind
|
|
* m_nPayOffStraight
|
|
* m_nPayOffFlush
|
|
* m_nPayOffFullHouse
|
|
* m_nPayOffFourofaKind
|
|
* m_nPayOffStraightFlush
|
|
* m_nPayOffRoyalFlush
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
void CMainPokerWindow::SetPayOffs(int nPayOffType) {
|
|
|
|
// set the payoffs according to what id was is sent in
|
|
switch (nPayOffType) {
|
|
case IDC_KLINGON:
|
|
m_nPayOffPair = 0;
|
|
m_nPayOffPairJackorHigher = 0;
|
|
m_nPayOffTwoPair = 1;
|
|
m_nPayOffThreeofaKind = 2;
|
|
m_nPayOffStraight = 3;
|
|
m_nPayOffFlush = 4;
|
|
m_nPayOffFullHouse = 5;
|
|
m_nPayOffFourofaKind = 10;
|
|
m_nPayOffStraightFlush = 20;
|
|
m_nPayOffRoyalFlush = 50;
|
|
break;
|
|
|
|
case IDC_VEGAS:
|
|
m_nPayOffPair = 0;
|
|
m_nPayOffPairJackorHigher = 1;
|
|
m_nPayOffTwoPair = 2;
|
|
m_nPayOffThreeofaKind = 3;
|
|
m_nPayOffStraight = 4;
|
|
m_nPayOffFlush = 6;
|
|
m_nPayOffFullHouse = 9;
|
|
m_nPayOffFourofaKind = 25;
|
|
m_nPayOffStraightFlush = 50;
|
|
m_nPayOffRoyalFlush = 250;
|
|
break;
|
|
|
|
case IDC_POPO:
|
|
m_nPayOffPair = 1;
|
|
m_nPayOffPairJackorHigher = 2;
|
|
m_nPayOffTwoPair = 3;
|
|
m_nPayOffThreeofaKind = 5;
|
|
m_nPayOffStraight = 8;
|
|
m_nPayOffFlush = 10;
|
|
m_nPayOffFullHouse = 15;
|
|
m_nPayOffFourofaKind = 50;
|
|
m_nPayOffStraightFlush = 100;
|
|
m_nPayOffRoyalFlush = 500;
|
|
break;
|
|
|
|
case IDC_KUWAITI:
|
|
m_nPayOffPair = 2;
|
|
m_nPayOffPairJackorHigher = 3;
|
|
m_nPayOffTwoPair = 5;
|
|
m_nPayOffThreeofaKind = 10;
|
|
m_nPayOffStraight = 15;
|
|
m_nPayOffFlush = 20;
|
|
m_nPayOffFullHouse = 50;
|
|
m_nPayOffFourofaKind = 100;
|
|
m_nPayOffStraightFlush = 250;
|
|
m_nPayOffRoyalFlush = 1000;
|
|
break;
|
|
|
|
case IDC_MARTIAN:
|
|
m_nPayOffPair = 2;
|
|
m_nPayOffPairJackorHigher = 2;
|
|
m_nPayOffTwoPair = 13;
|
|
m_nPayOffThreeofaKind = 3;
|
|
m_nPayOffStraight = 89;
|
|
m_nPayOffFlush = 98;
|
|
m_nPayOffFullHouse = 177;
|
|
m_nPayOffFourofaKind = 4;
|
|
m_nPayOffStraightFlush = 23;
|
|
m_nPayOffRoyalFlush = 11;
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
/*****************************************************************
|
|
*
|
|
* CheckWinningHand
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Checks the hand to see if it won
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* UserBet, UserAmount, aDealtArray
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* UserBet, UserAmount
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
void CMainPokerWindow::CheckWinningHand() {
|
|
int anShownCards[5]; // an array to contain the currently shown cards
|
|
int nSortSwap; // used in the sorting array to swap to numbers
|
|
int nPairMatch; // used to keep track of the number matches found,
|
|
//when looking for a pair, two pair, .. four of a kind
|
|
int nIndex, nLoop; // looping variables
|
|
int nCard = 0; // card in a pair, used to tell if a pair is Jacks or higher
|
|
CRect potRect; // a rect of screen coordinates
|
|
// that contain the pot and user amounts
|
|
CUserWonDlg dlgWon((CWnd *)this, pGamePalette);
|
|
|
|
// find out what cards are currently shown
|
|
for (nLoop = 0; nLoop < 5; nLoop++) {
|
|
anShownCards[nLoop] = 0;
|
|
}
|
|
|
|
for (nLoop = 0, nIndex = 0; nLoop <= 9; nLoop++, nIndex++) {
|
|
if (aDealtArray[nLoop][1] == 1)
|
|
anShownCards[nIndex] = aDealtArray[nLoop][0];
|
|
else
|
|
nIndex--;
|
|
}
|
|
|
|
|
|
// sort anShownCards
|
|
for (nLoop = 0; nLoop < 5; nLoop++) {
|
|
for (nIndex = 1; nIndex < 5; nIndex++) {
|
|
|
|
if (anShownCards[nIndex] < anShownCards[nIndex - 1]) {
|
|
nSortSwap = anShownCards[nIndex];
|
|
anShownCards[nIndex] = anShownCards[nIndex - 1];
|
|
anShownCards[nIndex - 1] = nSortSwap;
|
|
}
|
|
}
|
|
}
|
|
|
|
// check royal flush
|
|
if (((Mod(anShownCards[1], 13)) == 10) &&
|
|
(anShownCards[4] == anShownCards[1] + 3) &&
|
|
(anShownCards[0] == anShownCards[1] - 9)) {
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
|
|
// MessageBox("You got a Royal Flush", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(10);
|
|
dlgWon.DoModal();
|
|
|
|
sndPlaySound(nullptr, 0);
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffRoyalFlush;
|
|
return;
|
|
}
|
|
|
|
// check straight flush
|
|
if (anShownCards[4] == anShownCards[0] + 4) {
|
|
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Straight Flush", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(9);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffStraightFlush;
|
|
return;
|
|
}
|
|
|
|
// check for these, four of a kind, full house, three of a kind, two pair, one pair
|
|
nPairMatch = 0;
|
|
for (nLoop = 0; nLoop < 4; nLoop++) {
|
|
for (nIndex = nLoop + 1; nIndex < 5; nIndex++) {
|
|
if (Mod(anShownCards[nLoop], 13) == Mod(anShownCards[nIndex], 13)) {
|
|
nCard = Mod(anShownCards[nLoop], 13);
|
|
nPairMatch++;
|
|
}
|
|
}
|
|
}
|
|
// nPairMatch = 6 : four of a kind
|
|
// nPairMatch = 4 : full house
|
|
// nPairMatch = 3 : three of a kind
|
|
// nPairMatch = 2 : two pair
|
|
// nPairMatch = 1 : one pair
|
|
if (nPairMatch == 0)
|
|
nCard = 0;
|
|
if (nPairMatch == 6) {
|
|
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Four of a Kind", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(8);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffFourofaKind;
|
|
return;
|
|
}
|
|
if (nPairMatch == 4) {
|
|
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Full House", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(7);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffFullHouse;
|
|
return;
|
|
}
|
|
if (nPairMatch == 3) {
|
|
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Three of a Kind", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(4);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else {
|
|
m_lUserAmount += m_lUserBet * m_nPayOffThreeofaKind;
|
|
}
|
|
|
|
return;
|
|
}
|
|
if (nPairMatch == 2) {
|
|
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Two Pair", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(3);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffTwoPair;
|
|
return;
|
|
}
|
|
if (nPairMatch == 1) {
|
|
if ((nCard > 10) || (nCard == 1)) {
|
|
|
|
if (m_nPayOffPairJackorHigher == 0) {
|
|
if (m_bPlaySounds)
|
|
sndPlaySound(WAV_NOPAY, SND_ASYNC);
|
|
dlgWon.SetInitialOptions();
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
} else {
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Pair ( Jacks or Higher", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(2);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
}
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffPairJackorHigher;
|
|
} else {
|
|
if (m_nPayOffPair == 0) {
|
|
if (m_bPlaySounds)
|
|
sndPlaySound(WAV_NOPAY, SND_ASYNC);
|
|
dlgWon.SetInitialOptions();
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
} else {
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Pair", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(1);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
}
|
|
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffPair;
|
|
}
|
|
return;
|
|
}
|
|
|
|
// check for flush
|
|
for (nLoop = 0; nLoop < 53; nLoop += 13) {
|
|
if ((anShownCards[0] <= (13 + nLoop)) && (anShownCards[0] >= (nLoop)) &&
|
|
(anShownCards[4] <= (13 + nLoop)) && (anShownCards[4] >= (nLoop))) {
|
|
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Flush", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(6);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffFlush;
|
|
return;
|
|
}
|
|
}
|
|
|
|
// check for straight
|
|
for (nLoop = 0; nLoop < 5; nLoop++)
|
|
anShownCards[nLoop] = Mod(anShownCards[nLoop], 13);
|
|
|
|
|
|
// sort anShownCards
|
|
for (nLoop = 0; nLoop < 5; nLoop++) {
|
|
for (nIndex = 1; nIndex < 5; nIndex++) {
|
|
|
|
if (anShownCards[nIndex] < anShownCards[nIndex - 1]) {
|
|
nSortSwap = anShownCards[nIndex];
|
|
anShownCards[nIndex] = anShownCards[nIndex - 1];
|
|
anShownCards[nIndex - 1] = nSortSwap;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ((anShownCards[4] == anShownCards[0] + 4) ||
|
|
((anShownCards[0] == 1) &&
|
|
(anShownCards[4] == anShownCards[1] + 3) &&
|
|
(anShownCards[1] == 10))) {
|
|
|
|
if (m_bPlaySounds) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PAY, SND_ASYNC);
|
|
}
|
|
// MessageBox("You got a Straight", nullptr, MB_OK);
|
|
dlgWon.SetInitialOptions(5);
|
|
dlgWon.DoModal();
|
|
sndPlaySound(nullptr, 0);
|
|
// Check for overflow, if so then the user broken the bank, reset to zero
|
|
if (m_lUserAmount > m_lUserAmount + m_lUserBet * m_nPayOffRoyalFlush) {
|
|
m_lUserAmount = 2147483647;
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
|
|
MessageBox("Congratulations! You just broke the bank", "YOU WIN!", MB_OK);
|
|
m_lUserAmount = 0L;
|
|
} else
|
|
m_lUserAmount += m_lUserBet * m_nPayOffStraight;
|
|
return;
|
|
}
|
|
|
|
if (m_bPlaySounds)
|
|
sndPlaySound(WAV_NOPAY, SND_ASYNC);
|
|
dlgWon.SetInitialOptions();
|
|
dlgWon.DoModal();
|
|
|
|
sndPlaySound(nullptr, 0);
|
|
|
|
|
|
return;
|
|
}
|
|
/*****************************************************************
|
|
*
|
|
* SetBet
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Sets the bet and invaldates the the display, so that the
|
|
* bet gets shown to the user
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* size of the bet ( 1, 5, 10, 25, 100, 1000, min(ALL, 10000) )
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* UserBet, UserAmount
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* UserBet, UserAmount
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
void CMainPokerWindow::SetBet(long lBet) {
|
|
CRect potRect; // a pointer to the rect of screen coordinates
|
|
// that contain the pot and user amounts
|
|
|
|
// if lBet = 0, then reset the bet to zero
|
|
if (lBet == 0) {
|
|
m_lUserBet = 0;
|
|
m_lUserAmount -= lBet;
|
|
} else {
|
|
// if lBet > 0, then add it to the current bet
|
|
if (lBet > 0) {
|
|
if (m_lpGameStruct->bSoundEffectsEnabled) {
|
|
sndPlaySound(nullptr, 0);
|
|
sndPlaySound(WAV_PLACE, SND_ASYNC);
|
|
}
|
|
// if lBet > 10000, then max bet at 10000
|
|
if ((m_lUserBet + lBet) > MAXBET) {
|
|
lBet = MAXBET - m_lUserBet;
|
|
m_lUserBet = MAXBET;
|
|
m_lUserAmount -= lBet;
|
|
} else {
|
|
m_lUserBet += lBet;
|
|
m_lUserAmount -= lBet;
|
|
}
|
|
} else {
|
|
m_lUserAmount += m_lUserBet;
|
|
m_lUserBet = 0;
|
|
}
|
|
}
|
|
|
|
// redraw the pot and user amounts
|
|
potRect.SetRect(POT_AMOUNT_X, POT_AMOUNT_Y, POT_AMOUNT_X + 137, POT_AMOUNT_Y + 101);
|
|
InvalidateRect(&potRect, true);
|
|
|
|
|
|
// adjust the bet buttons
|
|
EnableBets();
|
|
return;
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
*
|
|
* OnXXXXXX
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* These functions are called when ever the corresponding WM_
|
|
* event message is generated for the mouse.
|
|
*
|
|
* (Add game-specific processing)
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* [Show arguments]
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* [External data read]
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* [External data modified]
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* [Discuss return value]
|
|
*
|
|
****************************************************************/
|
|
|
|
bool CMainPokerWindow::OnEraseBkgnd(CDC *pDC) {
|
|
// eat this
|
|
return true;
|
|
}
|
|
|
|
void CMainPokerWindow::OnActivate(unsigned int nState, CWnd *pWndOther, bool bMinimized) {
|
|
if (!bMinimized)
|
|
switch (nState) {
|
|
case WA_ACTIVE:
|
|
case WA_CLICKACTIVE:
|
|
InvalidateRect(nullptr, false);
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
/*****************************************************************
|
|
*
|
|
* SetHoldList
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* index = index in the Hold list, and of the button
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* abHoldArray
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* abHoldArray
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
void CMainPokerWindow::SetHoldList(int nIndex) {
|
|
bool bTestLoadBmp = false; // bool for testing to make sure that bitmaps were loaded
|
|
CDC *pDC = GetDC();
|
|
CPalette *pOldPal = pDC->SelectPalette(pGamePalette, false);
|
|
|
|
pDC->RealizePalette();
|
|
|
|
if (abHoldArray[nIndex]) {
|
|
abHoldArray[nIndex] = false;
|
|
pUpBmp = ExtractBitmap(pDC, pHoldButtons, pGamePalette,
|
|
(nIndex * HOLD_BMP_GRID_WITDH), HOLD_BMP_GRID_TOP2,
|
|
arHoldRect[nIndex].right - arHoldRect[nIndex].left,
|
|
arHoldRect[nIndex].bottom - arHoldRect[nIndex].top);
|
|
} else {
|
|
if (m_lpGameStruct->bSoundEffectsEnabled) {
|
|
sndPlaySound(nullptr, SND_ASYNC);
|
|
sndPlaySound(WAV_HOLD, SND_ASYNC);
|
|
}
|
|
abHoldArray[nIndex] = true;
|
|
pUpBmp = ExtractBitmap(pDC, pHoldButtons, pGamePalette,
|
|
(nIndex * HOLD_BMP_GRID_WITDH), HOLD_BMP_GRID_TOP1,
|
|
arHoldRect[nIndex].right - arHoldRect[nIndex].left,
|
|
arHoldRect[nIndex].bottom - arHoldRect[nIndex].top);
|
|
}
|
|
|
|
pDnBmp = ExtractBitmap(pDC, pHoldButtons, pGamePalette,
|
|
(nIndex * HOLD_BMP_GRID_WITDH), HOLD_BMP_GRID_TOP3,
|
|
arHoldRect[nIndex].right - arHoldRect[nIndex].left,
|
|
arHoldRect[nIndex].bottom - arHoldRect[nIndex].top);
|
|
pDsBmp = ExtractBitmap(pDC, pHoldButtons, pGamePalette,
|
|
(nIndex * HOLD_BMP_GRID_WITDH), HOLD_BMP_GRID_TOP4,
|
|
arHoldRect[nIndex].right - arHoldRect[nIndex].left,
|
|
arHoldRect[nIndex].bottom - arHoldRect[nIndex].top);
|
|
|
|
bTestLoadBmp = apHold[nIndex]->LoadBitmaps(pGamePalette, pUpBmp, pDnBmp, nullptr, pDsBmp);
|
|
ASSERT(bTestLoadBmp); // test for button's bitmap loading
|
|
|
|
pUpBmp = nullptr;
|
|
pDnBmp = nullptr;
|
|
pDsBmp = nullptr;
|
|
|
|
pDC->SelectPalette(pOldPal, false);
|
|
ReleaseDC(pDC);
|
|
}
|
|
|
|
/*****************************************************************
|
|
*
|
|
* DealNewCard
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Using a random number generator, select a number (card)
|
|
* from 1-52. Then check to make sure that this number (card)
|
|
* has not already been dealt. If not, then add it to bDealtArray
|
|
* and return it.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* None
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* bDealtArray
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* bDealtArray
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* The value [1-52] of the new card select (and added to the
|
|
* dealt array)
|
|
*
|
|
****************************************************************/
|
|
int CMainPokerWindow::DealNewCard() {
|
|
|
|
int nNewCard; // contains the new card number
|
|
int nCounter; // loop counter
|
|
bool bDealAgain; // bool to test that the card has not already been dealt
|
|
|
|
// generate a new number 1-52
|
|
do {
|
|
bDealAgain = false;
|
|
nNewCard = (brand() % 52) + 1;
|
|
for (nCounter = 0; nCounter < 9; ++nCounter) {
|
|
if (aDealtArray[nCounter][0] == nNewCard)
|
|
bDealAgain = true;
|
|
}
|
|
// until we get one that hs not been dealt yet
|
|
} while (bDealAgain);
|
|
|
|
// find the last entry into the dealt list
|
|
nCounter = 0;
|
|
while ((nCounter < 9) && (aDealtArray[nCounter][0] != 0))
|
|
++nCounter;
|
|
|
|
// put this new card into it
|
|
aDealtArray[nCounter][0] = nNewCard;
|
|
aDealtArray[nCounter][1] = 1;
|
|
|
|
// return the new card dealt
|
|
return nNewCard;
|
|
}
|
|
|
|
/*****************************************************************
|
|
*
|
|
* ShowNewCard
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Show the card inputted in the position inputted, by setting the
|
|
* that cardbutton bitmaps to the approriate card.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* card = the card number (1-52) to be displayed
|
|
* cardPos = the position to display the new card
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* apCard = the array of card buttons
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
void CMainPokerWindow::ShowNewCard(int nCard, int nCardPos) {
|
|
CPoint ptTemp(arCardRect[nCardPos].left + 1, arCardRect[nCardPos].top + 1);
|
|
bool bTestCreate = false;
|
|
CDC *pDC = GetDC();
|
|
|
|
pDC = GetDC();
|
|
if (apCard[nCardPos] != nullptr) {
|
|
apCard[nCardPos]->EraseSprite(pDC);
|
|
delete apCard[nCardPos];
|
|
apCard[nCardPos] = nullptr;
|
|
}
|
|
apCard[nCardPos] = new CSprite;
|
|
apCard[nCardPos]->SharePalette(pGamePalette);
|
|
bTestCreate = apCard[nCardPos]->LoadSprite(pDC, sBitmaps[nCard - 1]);
|
|
ASSERT(bTestCreate); // test for sprite's creation
|
|
apCard[nCardPos]->SetMasked(false);
|
|
apCard[nCardPos]->SetMobile(false);
|
|
apCard[nCardPos]->SetOptimizeSpeed(true);
|
|
ReleaseDC(pDC);
|
|
|
|
apCard[nCardPos]->PaintSprite(pDC, ptTemp.x, ptTemp.y);
|
|
|
|
// if i'm playing sound, play a card dealt sound
|
|
if (m_bPlaySounds)
|
|
sndPlaySound(CARDSOUND, SND_SYNC);
|
|
return ;
|
|
}
|
|
/*****************************************************************
|
|
*
|
|
* OnDrawItem
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* OnDrawItem is the OnPaint for my controls. I capture the
|
|
* controls I specifically want to draw myself, and send the
|
|
* rest to their default paints.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* itemType = identifier of the control sending the message
|
|
*
|
|
* lpdiDrawItemStruct = sent by windows it contains everything
|
|
* I need to draw like the HDC, the control ID, etc. For exact
|
|
* details see SDK on DRAWITEMSTRUCT.
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
void CMainPokerWindow::OnDrawItem(int itemType, LPDRAWITEMSTRUCT lpdiDrawItemStruct) {
|
|
|
|
CWnd::OnDrawItem(itemType, lpdiDrawItemStruct);
|
|
return;
|
|
}
|
|
|
|
/*
|
|
****************************************************************
|
|
*
|
|
* OnClose
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* This function is called when a Close event is generated. For
|
|
* this sample application we need only kill our event timer;
|
|
* The ExitInstance will handle releasing resources.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
void CMainPokerWindow::OnClose() {
|
|
CDC *pDC = GetDC();
|
|
CRect rctFillRect(0, 0, 640, 480);
|
|
CBrush Brush(RGB(0, 0, 0));
|
|
|
|
pDC->FillRect(&rctFillRect, &Brush);
|
|
ReleaseResources();
|
|
ReleaseDC(pDC);
|
|
CFrameWnd ::OnClose();
|
|
}
|
|
|
|
/*****************************************************************
|
|
*
|
|
* OnDestroy
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* This function is called when after the window has been destroyed.
|
|
* For poker, we post a message bak to the calling app to tell it
|
|
* that the user has quit the game, and therefore the app can unload
|
|
* this DLLL
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
void CMainPokerWindow::OnDestroy() {
|
|
// send a message to the calling app to tell it the user has quit the game
|
|
m_lpGameStruct->lCrowns = m_lUserAmount;
|
|
MFC::PostMessage(m_hCallAppWnd, WM_PARENTNOTIFY, WM_DESTROY, (LPARAM)m_lpGameStruct);
|
|
// m_lpGameStruct = nullptr;
|
|
// delete m_lpGameStruct;
|
|
CFrameWnd::OnDestroy();
|
|
}
|
|
|
|
/*****************************************************************
|
|
*
|
|
* Mod
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* This is a modified % that takes moves the 0 mod to the divisor
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* Dividend, Divisor
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
int CMainPokerWindow::Mod(int Dividend, int Divisor) {
|
|
int returnvalue = 0; // is the remainder of the mod
|
|
|
|
// do the standard modulo
|
|
returnvalue = Dividend % Divisor;
|
|
|
|
// but if there is no remainder, then set the remainder to the divisor
|
|
if (returnvalue == 0)
|
|
returnvalue = Divisor;
|
|
return returnvalue;
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************
|
|
*
|
|
* ReleaseResources
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Release all resources that were created and retained during the
|
|
* course of the game. This includes sprites in the sprite chain,
|
|
* the game color palette, and button controls.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
void CMainPokerWindow::ReleaseResources() {
|
|
int i;
|
|
|
|
if (pGameSound != nullptr) {
|
|
delete pGameSound; // delete the game theme song
|
|
pGameSound = nullptr;
|
|
}
|
|
|
|
for (i = 0; i < 7; i++) {
|
|
if (apBet[i] != nullptr)
|
|
delete apBet[i];
|
|
}
|
|
|
|
if (pUpBmp != nullptr)
|
|
delete pUpBmp;
|
|
|
|
if (pDnBmp != nullptr)
|
|
delete pDnBmp;
|
|
|
|
if (pDsBmp != nullptr)
|
|
delete pDsBmp;
|
|
|
|
if (pHoldButtons != nullptr)
|
|
delete pHoldButtons;
|
|
|
|
if (pBetButtons != nullptr)
|
|
delete pBetButtons;
|
|
|
|
delete pOptionButton; // release the buttons we used
|
|
delete pClearBet;
|
|
delete pDrawButton;
|
|
delete pDealButton;
|
|
|
|
for (i = 0; i < 5; i++) {
|
|
if (apCard[i] != nullptr)
|
|
delete apCard[i];
|
|
if (apHold[i] != nullptr)
|
|
delete apHold[i];
|
|
}
|
|
|
|
(*pGamePalette).DeleteObject(); // release the game color palette
|
|
delete pGamePalette;
|
|
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
*
|
|
* FlushInputEvents
|
|
*
|
|
* FUNCTIONAL DESCRIPTION:
|
|
*
|
|
* Remove all keyboard and mouse related events from the message
|
|
* so that they will not be sent to us for processing; i.e. this
|
|
* flushes keyboard type ahead and extra mouse clicks and movement.
|
|
*
|
|
* FORMAL PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT INPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* IMPLICIT OUTPUT PARAMETERS:
|
|
*
|
|
* n/a
|
|
*
|
|
* RETURN VALUE:
|
|
*
|
|
* n/a
|
|
*
|
|
****************************************************************/
|
|
|
|
void CMainPokerWindow::FlushInputEvents() {
|
|
MSG msg;
|
|
|
|
while (true) { // find and remove all keyboard events
|
|
if (!PeekMessage(&msg, nullptr, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE))
|
|
break;
|
|
}
|
|
|
|
while (true) { // find and remove all mouse events
|
|
if (!PeekMessage(&msg, nullptr, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE))
|
|
break;
|
|
}
|
|
}
|
|
|
|
LRESULT CMainPokerWindow::OnMCINotify(WPARAM wParam, LPARAM lParam) {
|
|
CSound *pSound;
|
|
|
|
pSound = CSound::OnMCIStopped(wParam, lParam);
|
|
if (pSound != nullptr)
|
|
OnSoundNotify(pSound);
|
|
return 0;
|
|
}
|
|
|
|
|
|
LRESULT CMainPokerWindow::OnMMIONotify(WPARAM wParam, LPARAM lParam) {
|
|
CSound *pSound;
|
|
|
|
pSound = CSound::OnMMIOStopped(wParam, lParam);
|
|
if (pSound != nullptr)
|
|
OnSoundNotify(pSound);
|
|
return 0;
|
|
}
|
|
|
|
void CMainPokerWindow::OnSoundNotify(CSound *pSound) {
|
|
//
|
|
// Add your code to process explicit notification of a sound "done" event here.
|
|
// pSound is a pointer to a CSound object for which you requested SOUND_NOTIFY.
|
|
//
|
|
}
|
|
|
|
// CMainPokerWindow message map:
|
|
// Associate messages with member functions.
|
|
//
|
|
BEGIN_MESSAGE_MAP(CMainPokerWindow, CFrameWnd)
|
|
//{{AFX_MSG_MAP( CMainPokerWindow )
|
|
ON_WM_PAINT()
|
|
ON_WM_RBUTTONDOWN()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_LBUTTONUP()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_CLOSE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_DRAWITEM()
|
|
ON_WM_ERASEBKGND()
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_ACTIVATE()
|
|
ON_MESSAGE(MM_MCINOTIFY, CMainPokerWindow::OnMCINotify)
|
|
ON_MESSAGE(MM_WOM_DONE, CMainPokerWindow::OnMMIONotify)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//
|
|
// Routine to play easter egg animations and sounds
|
|
void PlayEasterEgg(CDC *pDC, CWnd *pWnd, CPalette *pPalette,
|
|
const char *pszAnimFile, const char *pszSoundFile,
|
|
int nNumCels, int nXLoc, int nYLoc, int nSleep, bool bPlaySound) {
|
|
CSprite *pSprite = nullptr;
|
|
CSound *pEffect = nullptr;
|
|
bool bSuccess;
|
|
int i;
|
|
|
|
pSprite = new CSprite;
|
|
(*pSprite).SharePalette(pPalette);
|
|
bSuccess = (*pSprite).LoadCels(pDC, pszAnimFile, nNumCels);
|
|
if (!bSuccess) {
|
|
delete pSprite;
|
|
return;
|
|
}
|
|
(*pSprite).SetMasked(false);
|
|
(*pSprite).SetMobile(false);
|
|
|
|
if (bPlaySound) {
|
|
pEffect = new CSound(pWnd, pszSoundFile, // Load up the sound file as a
|
|
SOUND_WAVE | SOUND_ASYNCH | SOUND_QUEUE | SOUND_AUTODELETE); //...Wave file, to delete itself
|
|
}
|
|
if (pEffect != nullptr) {
|
|
bSuccess = (*pEffect).play();
|
|
if (!bSuccess)
|
|
delete pEffect;
|
|
}
|
|
(*pSprite).SetCel(nNumCels);
|
|
for (i = 0; i < nNumCels; i++) {
|
|
(*pSprite).PaintSprite(pDC, nXLoc, nYLoc);
|
|
Sleep(nSleep);
|
|
}
|
|
|
|
delete pSprite;
|
|
}
|
|
|
|
} // namespace Poker
|
|
} // namespace HodjNPodj
|
|
} // namespace Bagel
|