868 lines
21 KiB
C++
868 lines
21 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/spacebar/slot_wnd.h"
|
|
#include "bagel/spacebar/baglib/bagel.h"
|
|
#include "bagel/bagel.h"
|
|
#include "bagel/boflib/file_functions.h"
|
|
#include "bagel/boflib/log.h"
|
|
#include "bagel/boflib/sound.h"
|
|
|
|
namespace Bagel {
|
|
namespace SpaceBar {
|
|
|
|
#define FIXBMP "BGNDDN.BMP"
|
|
#define MAX_CREDITS 200000
|
|
// return $1; for casino background sounds
|
|
#define CASINO_AUDIO "CASINO.WAV"
|
|
|
|
#define BGCB_DIR "$SBARDIR\\BAR\\CLOSEUP\\BGCB\\"
|
|
#define WIN_AUDIO "BGNWIN.WAV"
|
|
#define SLOT_AUDIO "BGNSLOT.WAV"
|
|
|
|
struct ST_BUTTONS {
|
|
const char *_pszName;
|
|
const char *_pszUp;
|
|
const char *_pszDown;
|
|
const char *_pszFocus;
|
|
const char *_pszDisabled;
|
|
int _nLeft;
|
|
int _nTop;
|
|
int _nWidth;
|
|
int _nHeight;
|
|
int _nID;
|
|
};
|
|
|
|
static ST_BUTTONS g_stButtons[NUM_SLOTBUTT] = {
|
|
{ "One", "bgng01up.bmp", "bgng01dn.bmp", "bgng01up.bmp", "bgng01ds.bmp", 380, 304, 60, 42, ONE },
|
|
{ "Four", "bgng04up.bmp", "bgng04dn.bmp", "bgng04up.bmp", "bgng04ds.bmp", 380, 346, 60, 42, FOUR },
|
|
{ "Seven", "bgng07up.bmp", "bgng07dn.bmp", "bgng07up.bmp", "bgng07ds.bmp", 385, 391, 60, 42, SEVEN },
|
|
{ "Ten", "bgng10up.bmp", "bgng10dn.bmp", "bgng10up.bmp", "bgng10ds.bmp", 440, 304, 60, 42, TEN },
|
|
{ "Forty", "bgng40up.bmp", "bgng40dn.bmp", "bgng40up.bmp", "bgng40ds.bmp", 442, 346, 60, 42, FORTY },
|
|
{ "Sevty", "bgng70up.bmp", "bgng70dn.bmp", "bgng70up.bmp", "bgng70ds.bmp", 445, 391, 60, 42, SEVENTY },
|
|
{ "OneH", "bgng1hup.bmp", "bgng1hdn.bmp", "bgng1hup.bmp", "bgng1hds.bmp", 500, 304, 60, 42, OHNDRD },
|
|
{ "FourH", "bgng4hup.bmp", "bgng4hdn.bmp", "bgng4hup.bmp", "bgng4hds.bmp", 502, 346, 60, 42, RHNDRD },
|
|
{ "SevH", "bgng7hup.bmp", "bgng7hdn.bmp", "bgng7hup.bmp", "bgng7hds.bmp", 507, 391, 60, 42, SHNDRD },
|
|
{ "OneK", "bgng1kup.bmp", "bgng1kdn.bmp", "bgng1kup.bmp", "bgng1kds.bmp", 560, 304, 60, 42, OTHSND },
|
|
{ "FourK", "bgng4kup.bmp", "bgng4kdn.bmp", "bgng4kup.bmp", "bgng4kds.bmp", 564, 346, 60, 42, RTHSND },
|
|
{ "SevK", "bgng7kup.bmp", "bgng7kdn.bmp", "bgng7kup.bmp", "bgng7kds.bmp", 570, 391, 60, 42, STHSND },
|
|
{ "ClrBet", "bgneup.bmp", "bgnedn.bmp", "bgneup.bmp", "bgneds.bmp", 143, 371, 118, 69, CLRBET },
|
|
{ "BetAll", "bgnfup.bmp", "bgnfdn.bmp", "bgnfup.bmp", "bgnfds.bmp", 262, 322, 120, 90, BETALL },
|
|
{ "GO", "bgncdn.bmp", "bgncdn.bmp", "bgncdn.bmp", "bgncds.bmp", 401, 125, 42, 41, GO },
|
|
{ "Help", "helpup.bmp", "helpdown.bmp", "helpup.bmp", "helpup.bmp", 31, 445, 200, 30, SLOTHELP},
|
|
{ "Quit", "quitup.bmp", "quitdown.bmp", "quitup.bmp", "quitup.bmp", 407, 445, 200, 30, SLOTQUIT}
|
|
};
|
|
|
|
struct ST_SLOTBMPS {
|
|
const char *_pszName[SLOT_BMP_NUM];
|
|
};
|
|
|
|
static ST_SLOTBMPS g_stSlotBmps[SLOT_NUM] = {
|
|
{{"bgnst1.bmp", "bgnsq1.bmp", "bgnsc1.bmp", "bgnsn1.bmp", "bgnss1.bmp", "bgnsm1.bmp", "bgnse1.bmp", "bgnsa1.bmp", "bgnsh1.bmp" }},
|
|
{{"bgnst3.bmp", "bgnsq3.bmp", "bgnsc3.bmp", "bgnsn3.bmp", "bgnss3.bmp", "bgnsm3.bmp", "bgnse3.bmp", "bgnsa3.bmp", "bgnsh3.bmp" }},
|
|
{{"bgnst4.bmp", "bgnsq4.bmp", "bgnsc4.bmp", "bgnsn4.bmp", "bgnss4.bmp", "bgnsm4.bmp", "bgnse4.bmp", "bgnsa4.bmp", "bgnsh4.bmp" }},
|
|
{{"bgnst2.bmp", "bgnsq2.bmp", "bgnsc2.bmp", "bgnsn2.bmp", "bgnss2.bmp", "bgnsm2.bmp", "bgnse2.bmp", "bgnsa2.bmp", "bgnsh2.bmp" }}
|
|
};
|
|
|
|
// Local functions
|
|
const char *BuildSlotDir(const char *pszFile);
|
|
|
|
static bool g_bFix = false;
|
|
|
|
SBarSlotWnd::SBarSlotWnd() : CBagStorageDevWnd() {
|
|
for (int i = 0; i < NUM_SLOTBUTT; i++) {
|
|
_pSlotButs[i] = nullptr;
|
|
}
|
|
|
|
// Init all our slot bmp
|
|
for (int i = 0; i < SLOT_NUM; i++) {
|
|
_cSlots[i]._nIdx = g_engine->getRandomNumber() % SLOT_BMP_NUM;
|
|
for (int j = 0; j < SLOT_BMP_NUM; j++) {
|
|
_cSlots[i]._pSlotBmp[j] = nullptr;
|
|
}
|
|
}
|
|
|
|
_cSlots[0]._cSlotRect = Slot0Rect;
|
|
_cSlots[1]._cSlotRect = Slot1Rect;
|
|
_cSlots[2]._cSlotRect = Slot2Rect;
|
|
_cSlots[3]._cSlotRect = Slot3Rect;
|
|
|
|
_bFixBet = false;
|
|
_nBet = 0;
|
|
_nCredit = 0;
|
|
_pCredText = nullptr;
|
|
_pBetText = nullptr;
|
|
_pOddsText = nullptr;
|
|
_bAutoDecrement = false;
|
|
|
|
_nPayOff1 = 0;
|
|
_nPayOff2 = 0;
|
|
|
|
_bFixBmp = nullptr;
|
|
_pWinSound = nullptr;
|
|
_pSlotSound = nullptr;
|
|
_pLoseBmp = nullptr;
|
|
_pBkgSnd = nullptr;
|
|
_bLose = false;
|
|
|
|
CBagStorageDevWnd::setHelpFilename(BuildSlotDir("SLOT.TXT"));
|
|
|
|
// Call this thing a closeup so that time won't go
|
|
// by when entering the closeup
|
|
setCloseup(true);
|
|
}
|
|
|
|
|
|
void SBarSlotWnd::onPaint(CBofRect *pRect) {
|
|
assert(isValidObject(this));
|
|
|
|
if (!errorOccurred()) {
|
|
CBofBitmap *pBackBmp = getBackdrop();
|
|
|
|
//Paint the storage device
|
|
if (pBackBmp != nullptr) {
|
|
assert(getWorkBmp() != nullptr);
|
|
|
|
// Erase everything from the background
|
|
getWorkBmp()->paint(pBackBmp, pRect, pRect);
|
|
|
|
// Paint all the objects to the background
|
|
paintStorageDevice(nullptr, pBackBmp, pRect);
|
|
}
|
|
|
|
// Paint all our slot bmp
|
|
for (int i = 0; i < SLOT_NUM; i++) {
|
|
|
|
if (_cSlots[i]._pSlotBmp[_cSlots[i]._nIdx] != nullptr) {
|
|
_cSlots[i]._pSlotBmp[_cSlots[i]._nIdx]->paint(pBackBmp, &_cSlots[i]._cSlotRect, nullptr, CBagel::getBagApp()->getChromaColor());
|
|
}
|
|
}
|
|
|
|
if (_bFixBet && _bFixBmp != nullptr) {
|
|
_bFixBmp->paint(pBackBmp, FixRect.left, FixRect.top);
|
|
}
|
|
|
|
// Paint the backdrop
|
|
if (getBackdrop())
|
|
paintBackdrop();
|
|
|
|
updateText();
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::onMainLoop() {
|
|
// Do nothing
|
|
}
|
|
|
|
ErrorCode SBarSlotWnd::attach() {
|
|
_bLose = false;
|
|
_bFixBet = false;
|
|
|
|
_pSlotSound = new CBofSound(this, BuildSlotDir(SLOT_AUDIO), SOUND_MIX, 1);
|
|
|
|
if (CBagStorageDevWnd::attach() == ERR_NONE) {
|
|
// Must have a valid backdrop by now
|
|
assert(_pBackdrop != nullptr);
|
|
CBofPalette *pPal = _pBackdrop->getPalette();
|
|
|
|
_bFixBmp = new CBofBitmap(BuildSlotDir(FIXBMP));
|
|
|
|
// Build all our buttons
|
|
for (int i = 0; i < NUM_SLOTBUTT; i++) {
|
|
|
|
_pSlotButs[i] = new CBofBmpButton;
|
|
CBofBitmap *pUp = loadBitmap(BuildSlotDir(g_stButtons[i]._pszUp), pPal);
|
|
CBofBitmap *pDown = loadBitmap(BuildSlotDir(g_stButtons[i]._pszDown), pPal);
|
|
CBofBitmap *pFocus = loadBitmap(BuildSlotDir(g_stButtons[i]._pszFocus), pPal);
|
|
CBofBitmap *pDis = loadBitmap(BuildSlotDir(g_stButtons[i]._pszDisabled), pPal);
|
|
|
|
_pSlotButs[i]->loadBitmaps(pUp, pDown, pFocus, pDis);
|
|
_pSlotButs[i]->create(g_stButtons[i]._pszName, g_stButtons[i]._nLeft, g_stButtons[i]._nTop, g_stButtons[i]._nWidth, g_stButtons[i]._nHeight, this, g_stButtons[i]._nID);
|
|
_pSlotButs[i]->show();
|
|
}
|
|
|
|
if (_pLoseBmp == nullptr) {
|
|
_pLoseBmp = new CBofBitmap(BuildSlotDir("BGNV.BMP"), pPal);
|
|
}
|
|
|
|
// Hide the GO, LOSE Button until a bet is made
|
|
_pSlotButs[GO]->hide();
|
|
|
|
// Build all our slot bmp
|
|
for (int i = 0; i < SLOT_NUM; i++) {
|
|
_cSlots[i]._nIdx = g_engine->getRandomNumber() % SLOT_BMP_NUM;
|
|
for (int j = 0; j < SLOT_BMP_NUM; j++) {
|
|
_cSlots[i]._pSlotBmp[j] = new CBofBitmap(BuildSlotDir(g_stSlotBmps[i]._pszName[j]), pPal);
|
|
}
|
|
}
|
|
|
|
// Read in their total nuggets from game
|
|
CBagVar *pVar = g_VarManager->getVariable("NUGGETS");
|
|
|
|
if (pVar)
|
|
_nCredit = pVar->getNumValue();
|
|
|
|
// Initialize their bet
|
|
_nBet = 0;
|
|
|
|
// Setup the Credit text fields
|
|
_pCredText = new CBofText;
|
|
|
|
CBofRect cRect(CreditRect.left, CreditRect.top, CreditRect.right, CreditRect.bottom);
|
|
_pCredText->setupText(&cRect, JUSTIFY_RIGHT, FORMAT_CENTER_RIGHT);
|
|
_pCredText->setColor(CTEXT_WHITE);
|
|
_pCredText->SetSize(20);
|
|
_pCredText->setWeight(TEXT_BOLD);
|
|
_pCredText->setText(buildString("%d", _nCredit));
|
|
|
|
// Setup the Bet text fields
|
|
//
|
|
// Make sure that we don't already have one
|
|
assert(_pBetText == nullptr);
|
|
|
|
_pBetText = new CBofText;
|
|
|
|
cRect.setRect(BetRect.left, BetRect.top, BetRect.right, BetRect.bottom);
|
|
_pBetText->setupText(&cRect, JUSTIFY_RIGHT, FORMAT_CENTER_RIGHT);
|
|
_pBetText->setColor(CTEXT_WHITE);
|
|
_pBetText->SetSize(20);
|
|
_pBetText->setWeight(TEXT_BOLD);
|
|
_pBetText->setText(buildString("%d", _nBet));
|
|
|
|
// Setup the Odds text fields
|
|
//
|
|
// Make sure that we don't already have one
|
|
assert(_pOddsText == nullptr);
|
|
|
|
_pOddsText = new CBofText;
|
|
|
|
cRect.setRect(OddRect.left, OddRect.top, OddRect.right, OddRect.bottom);
|
|
_pOddsText->setupText(&cRect, JUSTIFY_RIGHT, FORMAT_CENTER_RIGHT);
|
|
_pOddsText->setColor(CTEXT_WHITE);
|
|
_pOddsText->SetSize(32);
|
|
_pOddsText->setWeight(TEXT_BOLD);
|
|
_pOddsText->setText("");
|
|
|
|
show();
|
|
invalidateRect(nullptr);
|
|
updateWindow();
|
|
}
|
|
|
|
_pBkgSnd = new CBofSound(this, BuildSlotDir(CASINO_AUDIO), SOUND_MIX, 99999);
|
|
_pBkgSnd->play();
|
|
|
|
CBagCursor::showSystemCursor();
|
|
|
|
return _errCode;
|
|
}
|
|
|
|
ErrorCode SBarSlotWnd::detach() {
|
|
CBagCursor::hideSystemCursor();
|
|
|
|
// Put any credits left in machine back into you credit chip.
|
|
if (_nBet > 0) {
|
|
_nCredit += _nBet;
|
|
}
|
|
|
|
// Write out new value of nuggets
|
|
CBagVar *pVar = g_VarManager->getVariable("NUGGETS");
|
|
if (pVar)
|
|
pVar->setValue(_nCredit);
|
|
|
|
if (_pBkgSnd != nullptr && _pBkgSnd->isPlaying())
|
|
_pBkgSnd->stop();
|
|
|
|
delete _pBkgSnd;
|
|
_pBkgSnd = nullptr;
|
|
|
|
delete _pLoseBmp;
|
|
_pLoseBmp = nullptr;
|
|
|
|
// Destroy all buttons
|
|
for (int i = 0; i < NUM_SLOTBUTT; i++) {
|
|
delete _pSlotButs[i];
|
|
_pSlotButs[i] = nullptr;
|
|
}
|
|
|
|
// Destroy all our slot bmp
|
|
for (int i = 0; i < SLOT_NUM; i++) {
|
|
_cSlots[i]._nIdx = 0;
|
|
|
|
for (int j = 0; j < SLOT_BMP_NUM; j++) {
|
|
delete _cSlots[i]._pSlotBmp[j];
|
|
_cSlots[i]._pSlotBmp[j] = nullptr;
|
|
}
|
|
}
|
|
|
|
delete _pCredText;
|
|
_pCredText = nullptr;
|
|
|
|
delete _pBetText;
|
|
_pBetText = nullptr;
|
|
|
|
delete _bFixBmp;
|
|
_bFixBmp = nullptr;
|
|
|
|
delete _pWinSound;
|
|
_pWinSound = nullptr;
|
|
|
|
delete _pSlotSound;
|
|
_pSlotSound = nullptr;
|
|
|
|
delete _pOddsText;
|
|
_pOddsText = nullptr;
|
|
|
|
CBagStorageDevWnd::detach();
|
|
|
|
// One turn has gone by
|
|
g_VarManager->incrementTimers();
|
|
|
|
return _errCode;
|
|
}
|
|
|
|
void SBarSlotWnd::addBet(int nBetVal) {
|
|
if (_nCredit < MAX_CREDITS) {
|
|
if (nBetVal <= _nCredit) {
|
|
|
|
_nBet += nBetVal;
|
|
_nCredit -= nBetVal;
|
|
|
|
// Check and see if we need to show the GO button
|
|
if (_nBet && !(_pSlotButs[GO]->isVisible())) {
|
|
_pSlotButs[GO]->show();
|
|
}
|
|
_nPayOff1 = 0;
|
|
_bLose = false;
|
|
_pOddsText->setText("");
|
|
|
|
updateText();
|
|
}
|
|
} else {
|
|
char szBuf[256];
|
|
Common::strcpy_s(szBuf, "The slot machine reads your credit chip balance, and makes an almost organic gurgling noise. A faint whiff of burnt components come from the interior of the machine.");
|
|
CBofString cString(szBuf, 256);
|
|
|
|
CBofRect cRect(0, 440, 640 - 1, 480 - 1);
|
|
|
|
CBofBitmap cBmp(cRect.width(), cRect.height(), (CBofPalette *)nullptr, false);
|
|
cBmp.captureScreen(this, &cRect);
|
|
|
|
paintBeveledText(&cRect, cString, FONT_15POINT, TEXT_NORMAL, CTEXT_WHITE, JUSTIFY_WRAP, FORMAT_TOP_LEFT);
|
|
waitForInput();
|
|
|
|
cBmp.paint(this, &cRect);
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::betAll() {
|
|
if (_nCredit < MAX_CREDITS) {
|
|
|
|
_nBet += _nCredit;
|
|
_nCredit = 0;
|
|
|
|
// Check and see if we need to show the GO button
|
|
if (_nBet && !_pSlotButs[GO]->isVisible())
|
|
_pSlotButs[GO]->show();
|
|
|
|
updateText();
|
|
|
|
} else {
|
|
|
|
char szBuf[256];
|
|
Common::strcpy_s(szBuf, "The bonkier apologizes, explaining that in light of your winning streak, the house can no longer accept your bets");
|
|
CBofString cString(szBuf, 256);
|
|
|
|
CBofRect cRect(0, 440, 640 - 1, 480 - 1);
|
|
|
|
CBofBitmap cBmp(cRect.width(), cRect.height(), (CBofPalette *)nullptr, false);
|
|
cBmp.captureScreen(this, &cRect);
|
|
|
|
paintBeveledText(&cRect, cString, FONT_15POINT, TEXT_NORMAL, CTEXT_WHITE, JUSTIFY_WRAP, FORMAT_TOP_LEFT);
|
|
waitForInput();
|
|
|
|
cBmp.paint(this, &cRect);
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::clrBet() {
|
|
_nCredit += _nBet;
|
|
_nBet = 0;
|
|
|
|
_pSlotButs[GO]->hide();
|
|
|
|
updateText();
|
|
}
|
|
|
|
void SBarSlotWnd::fixBet() {
|
|
_bFixBet = !_bFixBet;
|
|
|
|
if (!_bFixBet) {
|
|
_bAutoDecrement = false;
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::go() {
|
|
for (int i = 0; i < SLOT_NUM; i++) {
|
|
_cSlots[i]._nIdx = g_engine->getRandomNumber() % SLOT_BMP_NUM;
|
|
invalidateRect(&(_cSlots[i]._cSlotRect));
|
|
}
|
|
|
|
slideSlots();
|
|
calcOutcome();
|
|
|
|
// Hide the GO button
|
|
_pSlotButs[GO]->hide();
|
|
|
|
if (_bFixBet)
|
|
g_bFix = true;
|
|
|
|
updateText();
|
|
updateWindow();
|
|
|
|
g_bFix = false;
|
|
|
|
if (_bFixBet && _nBet != 0) {
|
|
bofSleep(3000);
|
|
_pSlotButs[GO]->show();
|
|
_pSlotButs[GO]->paint();
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::calcOutcome() {
|
|
int nMatch = 0;
|
|
int nMatchVal = 0;
|
|
int nGeo = 0;
|
|
int nCelest = 0;
|
|
int nLuck = 0;
|
|
|
|
// Clear out Payoffs
|
|
_nPayOff1 = 0;
|
|
_nPayOff2 = 0;
|
|
|
|
// Get number of matching slots
|
|
for (int i = 0; i < SLOT_NUM; i++) {
|
|
for (int j = i + 1; j < SLOT_NUM; j++) {
|
|
if (_cSlots[i]._nIdx == _cSlots[j]._nIdx) {
|
|
nMatch++;
|
|
nMatchVal = _cSlots[i]._nIdx;
|
|
}
|
|
}
|
|
}
|
|
|
|
// See if we are already a winner
|
|
if (nMatch > 3) // Quad
|
|
quadPays(nMatchVal);
|
|
else if (nMatch == 3) // Trio
|
|
tripPays(nMatchVal);
|
|
else if (nMatch == 2) // Two Pair
|
|
setPayOff(5, 2);
|
|
else if (nMatch == 1) // Pair
|
|
pairPays(nMatchVal);
|
|
else {
|
|
// Check for special trio
|
|
for (int i = 0; i < SLOT_NUM; i++) {
|
|
if (_cSlots[i]._nIdx < 3) // Geometric Trio
|
|
nGeo++;
|
|
if (_cSlots[i]._nIdx >= 3 && _cSlots[i]._nIdx < 6) // Celestial Trio
|
|
nCelest++;
|
|
if (_cSlots[i]._nIdx >= 6) // Lucky Trio
|
|
nLuck++;
|
|
}
|
|
|
|
if (nGeo == 3) {
|
|
_nPayOff1 = 1;
|
|
_nPayOff2 = 1;
|
|
} else if (nCelest == 3) {
|
|
_nPayOff1 = 3;
|
|
_nPayOff2 = 2;
|
|
} else if (nLuck == 3) {
|
|
_nPayOff1 = 2;
|
|
_nPayOff2 = 1;
|
|
}
|
|
}
|
|
|
|
// Do we have a winner ?
|
|
if (_nPayOff1 > 0) {
|
|
// Play winning audio
|
|
_pWinSound = new CBofSound(this, BuildSlotDir(WIN_AUDIO), SOUND_MIX, 1);
|
|
_pWinSound->play();
|
|
|
|
// Calc new credit
|
|
_nCredit += (_nBet * _nPayOff1) / _nPayOff2;
|
|
_bLose = false;
|
|
|
|
} else {
|
|
_pLoseBmp->paint(this, 401, 125);
|
|
_bLose = true;
|
|
_pOddsText->setText("");
|
|
}
|
|
|
|
// Put up better luck next time if bet not fixed, clear bet
|
|
if (_bFixBet == false) {
|
|
_nBet = 0;
|
|
|
|
} else {
|
|
_bAutoDecrement = true;
|
|
|
|
// If the player has fixed the bet,now is the time to decrement
|
|
if (_nCredit >= _nBet) {
|
|
_nCredit -= _nBet;
|
|
} else {
|
|
_nBet = _nCredit;
|
|
_nCredit = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::quadPays(int nSlotIdx) {
|
|
switch (nSlotIdx) {
|
|
case 0: // triangle
|
|
setPayOff(25, 1);
|
|
break;
|
|
case 1: // square
|
|
setPayOff(50, 1);
|
|
break;
|
|
case 2: // circle
|
|
setPayOff(75, 1);
|
|
break;
|
|
case 3: // sun
|
|
setPayOff(100, 1);
|
|
break;
|
|
case 4: // star
|
|
setPayOff(150, 1);
|
|
break;
|
|
case 5: // moon
|
|
setPayOff(200, 1);
|
|
break;
|
|
case 6: // eye
|
|
setPayOff(300, 1);
|
|
break;
|
|
case 7: // atom
|
|
setPayOff(400, 1);
|
|
break;
|
|
case 8: // shoe
|
|
setPayOff(500, 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::tripPays(int nSlotIdx) {
|
|
switch (nSlotIdx) {
|
|
case 0: // triangle
|
|
case 1: // square
|
|
case 2: // circle
|
|
setPayOff(3, 1);
|
|
break;
|
|
case 3: // sun
|
|
case 4: // star
|
|
case 5: // moon
|
|
setPayOff(4, 1);
|
|
break;
|
|
case 6: // eye
|
|
setPayOff(5, 1);
|
|
break;
|
|
case 7: // atom
|
|
setPayOff(7, 1);
|
|
break;
|
|
case 8: // shoe
|
|
setPayOff(10, 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::pairPays(int nSlotIdx) {
|
|
switch (nSlotIdx) {
|
|
case 0: // triangle
|
|
case 1: // square
|
|
case 2: // circle
|
|
setPayOff(1, 4);
|
|
break;
|
|
case 3: // sun
|
|
case 4: // star
|
|
case 5: // moon
|
|
setPayOff(1, 3);
|
|
break;
|
|
case 6: // eye
|
|
setPayOff(1, 2);
|
|
break;
|
|
case 7: // atom
|
|
setPayOff(1, 1);
|
|
break;
|
|
case 8: // shoe
|
|
setPayOff(3, 2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::setPayOff(int nPay1, int nPay2) {
|
|
_nPayOff1 = nPay1;
|
|
_nPayOff2 = nPay2;
|
|
}
|
|
|
|
void SBarSlotWnd::slideSlots() {
|
|
assert(isValidObject(this));
|
|
|
|
if (!errorOccurred()) {
|
|
int nIncrement = 30; // Number of pixels to move
|
|
int nMaskClr = CBagel::getBagApp()->getChromaColor();
|
|
|
|
// Erase Previous game
|
|
CBofRect cRect(219, 12, 626, 276);
|
|
if (_pBackdrop != nullptr) {
|
|
_pBackdrop->paint(this, &cRect, &cRect);
|
|
}
|
|
|
|
// Slot #1
|
|
CBofBitmap *pCurBmp = _cSlots[0]._pSlotBmp[_cSlots[0]._nIdx];
|
|
CBofRect BmpRect = pCurBmp->getRect();
|
|
CBofRect SrcRect = BmpRect;
|
|
SrcRect.left = SrcRect.right;
|
|
CBofRect DestRect = _cSlots[0]._cSlotRect;
|
|
|
|
for (int i = 1; SrcRect.left > BmpRect.left; i++) {
|
|
bofSleep(30);
|
|
|
|
SrcRect.left = SrcRect.right - (i * nIncrement);
|
|
|
|
// Check limits
|
|
if (SrcRect.left < BmpRect.left)
|
|
SrcRect.left = BmpRect.left;
|
|
|
|
cRect.setRect(DestRect.left, DestRect.top, DestRect.left + SrcRect.width() - 1, DestRect.top + SrcRect.height() - 1);
|
|
|
|
pCurBmp->paintMaskBackdrop(this, &cRect, &SrcRect, nMaskClr);
|
|
}
|
|
_pSlotSound->play();
|
|
|
|
// Slot #2
|
|
pCurBmp = _cSlots[1]._pSlotBmp[_cSlots[1]._nIdx];
|
|
BmpRect = pCurBmp->getRect();
|
|
SrcRect = BmpRect;
|
|
SrcRect.top = SrcRect.bottom;
|
|
DestRect = _cSlots[1]._cSlotRect;
|
|
|
|
for (int i = 1; SrcRect.top > BmpRect.top; i++) {
|
|
bofSleep(30);
|
|
|
|
SrcRect.top = SrcRect.bottom - (i * nIncrement);
|
|
|
|
// Check limits
|
|
if (SrcRect.top < BmpRect.top)
|
|
SrcRect.top = BmpRect.top;
|
|
|
|
cRect.setRect(DestRect.left, DestRect.top, DestRect.left + SrcRect.width() - 1, DestRect.top + SrcRect.height() - 1);
|
|
pCurBmp->paintMaskBackdrop(this, &cRect, &SrcRect, nMaskClr);
|
|
}
|
|
|
|
_pSlotSound->play();
|
|
|
|
// Slot #3
|
|
pCurBmp = _cSlots[2]._pSlotBmp[_cSlots[2]._nIdx];
|
|
BmpRect = pCurBmp->getRect();
|
|
SrcRect = BmpRect;
|
|
SrcRect.right = SrcRect.left;
|
|
DestRect = _cSlots[2]._cSlotRect;
|
|
|
|
for (int i = 1; SrcRect.right < BmpRect.right; i++) {
|
|
bofSleep(30);
|
|
|
|
SrcRect.right = SrcRect.left + (i * nIncrement);
|
|
|
|
// Check limits
|
|
if (SrcRect.right > BmpRect.right)
|
|
SrcRect.right = BmpRect.right;
|
|
|
|
cRect.setRect(DestRect.right - SrcRect.width() + 1, DestRect.top, DestRect.right, DestRect.top + SrcRect.height() - 1);
|
|
pCurBmp->paintMaskBackdrop(this, &cRect, &SrcRect, nMaskClr);
|
|
}
|
|
_pSlotSound->play();
|
|
|
|
// Slot #4
|
|
pCurBmp = _cSlots[3]._pSlotBmp[_cSlots[3]._nIdx];
|
|
BmpRect = pCurBmp->getRect();
|
|
SrcRect = BmpRect;
|
|
SrcRect.bottom = SrcRect.top;
|
|
DestRect = _cSlots[3]._cSlotRect;
|
|
|
|
for (int i = 1; SrcRect.bottom < BmpRect.bottom; i++) {
|
|
bofSleep(30);
|
|
|
|
SrcRect.bottom = SrcRect.top + (i * nIncrement);
|
|
|
|
// Check limits
|
|
if (SrcRect.bottom > BmpRect.bottom)
|
|
SrcRect.bottom = BmpRect.bottom;
|
|
|
|
cRect.setRect(DestRect.left, DestRect.bottom - SrcRect.height() + 1, DestRect.left + SrcRect.width() - 1, DestRect.bottom);
|
|
pCurBmp->paintMaskBackdrop(this, &cRect, &SrcRect, nMaskClr);
|
|
}
|
|
|
|
_pSlotSound->play();
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::updateText() {
|
|
assert(isValidObject(this));
|
|
if (errorOccurred())
|
|
return;
|
|
|
|
if (_nPayOff1 > 0 && _pOddsText != nullptr) {
|
|
_pOddsText->setText(buildString("%d:%d", _nPayOff1, _nPayOff2));
|
|
}
|
|
|
|
if (_pCredText != nullptr) {
|
|
_pCredText->setText(buildString("%d", _nCredit));
|
|
_pCredText->display(this);
|
|
}
|
|
|
|
// Update bet
|
|
if (_pBetText != nullptr) {
|
|
_pBetText->setText(buildString("%d", _nBet));
|
|
_pBetText->display(this);
|
|
}
|
|
|
|
if (_bLose) {
|
|
|
|
if (_pLoseBmp != nullptr) {
|
|
_pLoseBmp->paint(this, 401, 125);
|
|
}
|
|
|
|
if (_pOddsText != nullptr) {
|
|
_pOddsText->setText("");
|
|
}
|
|
|
|
} else if (_nBet && !g_bFix) {
|
|
// Check and see if we need to show the GO button
|
|
if (_pSlotButs[GO] != nullptr) {
|
|
_pSlotButs[GO]->show();
|
|
_pSlotButs[GO]->paint();
|
|
}
|
|
} else if (_pOddsText != nullptr) {
|
|
_pOddsText->display(this);
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::onTimer(uint32 /*nTimerId*/) {
|
|
}
|
|
|
|
void SBarSlotWnd::onLButtonDown(uint32 /*nFlags*/, CBofPoint *pPoint, void *) {
|
|
if (FixRect.ptInRect(*pPoint)) {
|
|
fixBet();
|
|
invalidateRect(&FixRect);
|
|
}
|
|
}
|
|
|
|
void SBarSlotWnd::onBofButton(CBofObject *pObject, int nState) {
|
|
assert(isValidObject(this));
|
|
assert(pObject != nullptr);
|
|
|
|
if (nState != BUTTON_CLICKED)
|
|
return;
|
|
|
|
CBofButton *pButton = (CBofButton *)pObject;
|
|
|
|
switch (pButton->getControlID()) {
|
|
case ONE:
|
|
addBet(1);
|
|
break;
|
|
case FOUR:
|
|
addBet(4);
|
|
break;
|
|
case SEVEN:
|
|
addBet(7);
|
|
break;
|
|
case TEN:
|
|
addBet(10);
|
|
break;
|
|
case FORTY:
|
|
addBet(40);
|
|
break;
|
|
case SEVENTY:
|
|
addBet(70);
|
|
break;
|
|
case OHNDRD:
|
|
addBet(100);
|
|
break;
|
|
case RHNDRD:
|
|
addBet(400);
|
|
break;
|
|
case SHNDRD:
|
|
addBet(700);
|
|
break;
|
|
case OTHSND:
|
|
addBet(1000);
|
|
break;
|
|
case RTHSND:
|
|
addBet(4000);
|
|
break;
|
|
case STHSND:
|
|
addBet(7000);
|
|
break;
|
|
case CLRBET:
|
|
clrBet();
|
|
break;
|
|
case BETALL:
|
|
betAll();
|
|
break;
|
|
case GO:
|
|
go();
|
|
break;
|
|
case SLOTQUIT:
|
|
logInfo("\tClicked Quit");
|
|
close();
|
|
break;
|
|
|
|
case SLOTHELP: {
|
|
logInfo("\tClicked Help");
|
|
|
|
CBagel *pApp = CBagel::getBagApp();
|
|
if (pApp != nullptr) {
|
|
CBagMasterWin *pWin = pApp->getMasterWnd();
|
|
if (pWin != nullptr)
|
|
pWin->onHelp(BuildSlotDir("SLOT.TXT"));
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
logWarning(buildString("Clicked Unknown Button with ID %d", pButton->getControlID()));
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
const char *BuildSlotDir(const char *pszFile) {
|
|
assert(pszFile != nullptr);
|
|
|
|
static char szBuf[MAX_DIRPATH];
|
|
|
|
// Where Slot assets
|
|
Common::sprintf_s(szBuf, "%s%s", BGCB_DIR, pszFile);
|
|
|
|
CBofString sSlotDir(szBuf, MAX_DIRPATH);
|
|
fixPathName(sSlotDir);
|
|
|
|
return &szBuf[0];
|
|
}
|
|
|
|
} // namespace SpaceBar
|
|
} // namespace Bagel
|