524 lines
13 KiB
C++
524 lines
13 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/afxwin.h"
|
|
#include "bagel/hodjnpodj/globals.h"
|
|
#include "bagel/hodjnpodj/hnplibs/text.h"
|
|
#include "bagel/hodjnpodj/hnplibs/cbofdlg.h"
|
|
#include "bagel/hodjnpodj/hnplibs/menures.h"
|
|
#include "bagel/hodjnpodj/hnplibs/button.h"
|
|
#include "bagel/hodjnpodj/fuge/usercfg.h"
|
|
|
|
namespace Bagel {
|
|
namespace HodjNPodj {
|
|
namespace Fuge {
|
|
|
|
#define ID_RESET 104
|
|
|
|
#define ID_SCROLL1 105
|
|
#define ID_SCROLL2 106
|
|
#define ID_SCROLL3 107
|
|
#define ID_SCROLL4 108
|
|
|
|
#define ID_WALLS 109
|
|
|
|
#define PAGE_SIZE 2
|
|
|
|
extern const char *INI_SECTION;
|
|
|
|
static CColorButton *pOKButton = nullptr; // OKAY button on scroll
|
|
static CColorButton *pCancelButton = nullptr; // Cancel button on scroll
|
|
static CColorButton *pDefaultsButton = nullptr; // Defaults button on scroll
|
|
|
|
|
|
CUserCfgDlg::CUserCfgDlg(CWnd *pParent, CPalette *pPalette, unsigned int nID)
|
|
: CBmpDialog(pParent, pPalette, nID, ".\\ART\\SSCROLL.BMP") {
|
|
// Inits
|
|
//
|
|
m_pScrollBar1 = nullptr;
|
|
m_pScrollBar2 = nullptr;
|
|
m_pScrollBar3 = nullptr;
|
|
m_pScrollBar4 = nullptr;
|
|
m_pTxtNumBalls = nullptr;
|
|
m_pTxtStartLevel = nullptr;
|
|
m_pTxtBallSpeed = nullptr;
|
|
m_pTxtPaddleSize = nullptr;
|
|
|
|
DoModal();
|
|
}
|
|
|
|
void CUserCfgDlg::DoDataExchange(CDataExchange *pDX) {
|
|
CBmpDialog::DoDataExchange(pDX);
|
|
}
|
|
|
|
|
|
void CUserCfgDlg::PutDlgData() {
|
|
m_pScrollBar1->SetScrollPos(m_nNumBalls);
|
|
m_pScrollBar2->SetScrollPos(m_nStartLevel);
|
|
m_pScrollBar3->SetScrollPos(m_nBallSpeed);
|
|
m_pScrollBar4->SetScrollPos(m_nPaddleSize);
|
|
|
|
m_pWallButton->SetCheck(m_bOutterWall);
|
|
}
|
|
|
|
|
|
void CUserCfgDlg::GetDlgData() {
|
|
m_nNumBalls = m_pScrollBar1->GetScrollPos();
|
|
m_nStartLevel = m_pScrollBar2->GetScrollPos();
|
|
m_nBallSpeed = m_pScrollBar3->GetScrollPos();
|
|
m_nPaddleSize = m_pScrollBar4->GetScrollPos();
|
|
|
|
m_bOutterWall = false;
|
|
if (m_pWallButton->GetCheck() == 1) {
|
|
m_bOutterWall = true;
|
|
}
|
|
}
|
|
|
|
|
|
bool CUserCfgDlg::OnCommand(WPARAM wParam, LPARAM lParam) {
|
|
/*
|
|
* respond to user
|
|
*/
|
|
if (HIWORD(lParam) == BN_CLICKED) {
|
|
|
|
switch (wParam) {
|
|
|
|
case IDOK:
|
|
m_bSave = true;
|
|
PostMessage(WM_CLOSE, 0, 0);
|
|
return false;
|
|
|
|
case IDCANCEL:
|
|
PostMessage(WM_CLOSE, 0, 0);
|
|
return false;
|
|
|
|
/*
|
|
* reset params to default
|
|
*/
|
|
case ID_RESET:
|
|
|
|
m_nNumBalls = BALLS_DEF;
|
|
m_nStartLevel = LEVEL_DEF;
|
|
m_nBallSpeed = SPEED_DEF;
|
|
m_nPaddleSize = PSIZE_DEF;
|
|
m_bOutterWall = false;
|
|
|
|
PutDlgData();
|
|
|
|
UpdateOptions();
|
|
break;
|
|
|
|
case ID_WALLS:
|
|
m_bOutterWall = !m_bOutterWall;
|
|
PutDlgData();
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return CBmpDialog::OnCommand(wParam, lParam);
|
|
}
|
|
|
|
void CUserCfgDlg::OnHScroll(unsigned int nSBCode, unsigned int nPos, CScrollBar *pScroll) {
|
|
char buf[40];
|
|
int nMin, nMax, nVal;
|
|
CDC *pDC;
|
|
|
|
// can't access a null pointer
|
|
assert(pScroll != nullptr);
|
|
|
|
if (pScroll == m_pScrollBar1) {
|
|
|
|
nMin = BALLS_MIN;
|
|
nMax = BALLS_MAX;
|
|
nVal = m_nNumBalls;
|
|
|
|
} else if (pScroll == m_pScrollBar2) {
|
|
|
|
nMin = LEVEL_MIN;
|
|
nMax = LEVEL_MAX;
|
|
nVal = m_nStartLevel;
|
|
|
|
} else if (pScroll == m_pScrollBar3) {
|
|
|
|
nMin = SPEED_MIN;
|
|
nMax = SPEED_MAX;
|
|
nVal = m_nBallSpeed;
|
|
|
|
} else {
|
|
assert(pScroll == m_pScrollBar4);
|
|
|
|
nMin = PSIZE_MIN;
|
|
nMax = PSIZE_MAX;
|
|
nVal = m_nPaddleSize;
|
|
}
|
|
|
|
switch (nSBCode) {
|
|
|
|
case SB_LEFT:
|
|
nVal = nMin;
|
|
break;
|
|
|
|
case SB_PAGELEFT:
|
|
nVal -= PAGE_SIZE;
|
|
break;
|
|
|
|
case SB_LINELEFT:
|
|
if (nVal > nMin)
|
|
nVal--;
|
|
break;
|
|
|
|
case SB_RIGHT:
|
|
nVal = nMax;
|
|
break;
|
|
|
|
case SB_PAGERIGHT:
|
|
nVal += PAGE_SIZE;
|
|
break;
|
|
|
|
case SB_LINERIGHT:
|
|
if (nVal < nMax)
|
|
nVal++;
|
|
break;
|
|
|
|
case SB_THUMBPOSITION:
|
|
case SB_THUMBTRACK:
|
|
nVal = nPos;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (nVal < nMin)
|
|
nVal = nMin;
|
|
if (nVal > nMax)
|
|
nVal = nMax;
|
|
|
|
pScroll->SetScrollPos(nVal);
|
|
|
|
if ((pDC = GetDC()) != nullptr) {
|
|
|
|
if (pScroll == m_pScrollBar1) {
|
|
|
|
m_nNumBalls = nVal;
|
|
if (m_pTxtNumBalls != nullptr) {
|
|
Common::sprintf_s(buf, "Number of Balls: %d", m_nNumBalls);
|
|
m_pTxtNumBalls->DisplayString(pDC, buf, 14, TEXT_BOLD, RGB(0, 0, 0));
|
|
}
|
|
|
|
} else if (pScroll == m_pScrollBar2) {
|
|
|
|
m_nStartLevel = nVal;
|
|
if (m_pTxtStartLevel != nullptr) {
|
|
Common::sprintf_s(buf, "Starting Level: %d", m_nStartLevel);
|
|
m_pTxtStartLevel->DisplayString(pDC, buf, 14, TEXT_BOLD, RGB(0, 0, 0));
|
|
}
|
|
|
|
} else if (pScroll == m_pScrollBar3) {
|
|
|
|
m_nBallSpeed = nVal;
|
|
if (m_pTxtBallSpeed != nullptr) {
|
|
Common::sprintf_s(buf, "Ball Speed: %d", m_nBallSpeed);
|
|
m_pTxtBallSpeed->DisplayString(pDC, buf, 14, TEXT_BOLD, RGB(0, 0, 0));
|
|
}
|
|
|
|
} else if (pScroll == m_pScrollBar4) {
|
|
|
|
m_nPaddleSize = nVal;
|
|
if (m_pTxtPaddleSize != nullptr) {
|
|
Common::sprintf_s(buf, "Paddle Size: %d", m_nPaddleSize);
|
|
m_pTxtPaddleSize->DisplayString(pDC, buf, 14, TEXT_BOLD, RGB(0, 0, 0));
|
|
}
|
|
|
|
} else {
|
|
assert(0);
|
|
}
|
|
ReleaseDC(pDC);
|
|
}
|
|
}
|
|
|
|
|
|
bool CUserCfgDlg::OnInitDialog() {
|
|
CRect tmpRect;
|
|
CDC *pDC;
|
|
|
|
CBmpDialog::OnInitDialog();
|
|
|
|
if ((pDC = GetDC()) != nullptr) {
|
|
|
|
tmpRect.SetRect(22, 22, 135, 35);
|
|
if ((m_pTxtNumBalls = new CText) != nullptr) {
|
|
m_pTxtNumBalls->SetupText(pDC, m_pPalette, &tmpRect, JUSTIFY_LEFT);
|
|
}
|
|
|
|
tmpRect.SetRect(22, 35, 92, 53);
|
|
if ((m_pScrollBar1 = new CScrollBar) != nullptr) {
|
|
m_pScrollBar1->Create(WS_VISIBLE | WS_CHILD | SBS_HORZ | SBS_BOTTOMALIGN, tmpRect, this, ID_SCROLL1);
|
|
m_pScrollBar1->SetScrollRange(BALLS_MIN, BALLS_MAX, true);
|
|
}
|
|
|
|
tmpRect.SetRect(22, 57, 135, 70);
|
|
if ((m_pTxtStartLevel = new CText) != nullptr) {
|
|
m_pTxtStartLevel->SetupText(pDC, m_pPalette, &tmpRect, JUSTIFY_LEFT);
|
|
}
|
|
|
|
tmpRect.SetRect(22, 70, 92, 88);
|
|
if ((m_pScrollBar2 = new CScrollBar) != nullptr) {
|
|
m_pScrollBar2->Create(WS_VISIBLE | WS_CHILD | SBS_HORZ | SBS_BOTTOMALIGN, tmpRect, this, ID_SCROLL2);
|
|
m_pScrollBar2->SetScrollRange(LEVEL_MIN, LEVEL_MAX, true);
|
|
}
|
|
|
|
tmpRect.SetRect(22, 92, 135, 105);
|
|
if ((m_pTxtBallSpeed = new CText) != nullptr) {
|
|
m_pTxtBallSpeed->SetupText(pDC, m_pPalette, &tmpRect, JUSTIFY_LEFT);
|
|
}
|
|
|
|
tmpRect.SetRect(22, 105, 92, 123);
|
|
if ((m_pScrollBar3 = new CScrollBar) != nullptr) {
|
|
m_pScrollBar3->Create(WS_VISIBLE | WS_CHILD | SBS_HORZ | SBS_BOTTOMALIGN, tmpRect, this, ID_SCROLL3);
|
|
m_pScrollBar3->SetScrollRange(SPEED_MIN, SPEED_MAX, true);
|
|
}
|
|
|
|
tmpRect.SetRect(22, 127, 110, 140);
|
|
if ((m_pTxtPaddleSize = new CText) != nullptr) {
|
|
m_pTxtPaddleSize->SetupText(pDC, m_pPalette, &tmpRect, JUSTIFY_LEFT);
|
|
}
|
|
|
|
tmpRect.SetRect(22, 140, 92, 158);
|
|
if ((m_pScrollBar4 = new CScrollBar) != nullptr) {
|
|
m_pScrollBar4->Create(WS_VISIBLE | WS_CHILD | SBS_HORZ | SBS_BOTTOMALIGN, tmpRect, this, ID_SCROLL4);
|
|
m_pScrollBar4->SetScrollRange(PSIZE_MIN, PSIZE_MAX, true);
|
|
}
|
|
|
|
ReleaseDC(pDC);
|
|
}
|
|
|
|
if ((pOKButton = new CColorButton) != nullptr) { // build a color QUIT button to let us exit
|
|
pOKButton->SetPalette(m_pPalette); // set the palette to use
|
|
pOKButton->SetControl(IDOK, this); // tie to the dialog control
|
|
}
|
|
|
|
if ((pCancelButton = new CColorButton) != nullptr) { // build a color QUIT button to let us exit
|
|
pCancelButton->SetPalette(m_pPalette); // set the palette to use
|
|
pCancelButton->SetControl(IDCANCEL, this); // tie to the dialog control
|
|
}
|
|
|
|
if ((pDefaultsButton = new CColorButton) != nullptr) { // build a color QUIT button to let us exit
|
|
pDefaultsButton->SetPalette(m_pPalette); // set the palette to use
|
|
pDefaultsButton->SetControl(ID_RESET, this); // tie to the dialog control
|
|
}
|
|
|
|
if ((m_pWallButton = new CCheckButton) != nullptr) {
|
|
m_pWallButton->SetPalette(m_pPalette);
|
|
m_pWallButton->SetControl(ID_WALLS, this);
|
|
}
|
|
|
|
m_bSave = false;
|
|
|
|
LoadIniSettings();
|
|
|
|
PutDlgData();
|
|
|
|
return true;
|
|
}
|
|
|
|
void CUserCfgDlg::OnPaint() {
|
|
CBmpDialog::OnPaint();
|
|
|
|
UpdateOptions();
|
|
}
|
|
|
|
void CUserCfgDlg::UpdateOptions() {
|
|
char buf[40];
|
|
CDC *pDC;
|
|
|
|
if ((pDC = GetDC()) != nullptr) {
|
|
|
|
if (m_pTxtNumBalls != nullptr) {
|
|
Common::sprintf_s(buf, "Number of Balls: %d", m_nNumBalls);
|
|
m_pTxtNumBalls->DisplayString(pDC, buf, 14, TEXT_BOLD, RGB(0, 0, 0));
|
|
}
|
|
|
|
if (m_pTxtStartLevel != nullptr) {
|
|
Common::sprintf_s(buf, "Starting Level: %d", m_nStartLevel);
|
|
m_pTxtStartLevel->DisplayString(pDC, buf, 14, TEXT_BOLD, RGB(0, 0, 0));
|
|
}
|
|
|
|
if (m_pTxtBallSpeed != nullptr) {
|
|
Common::sprintf_s(buf, "Ball Speed: %d", m_nBallSpeed);
|
|
m_pTxtBallSpeed->DisplayString(pDC, buf, 14, TEXT_BOLD, RGB(0, 0, 0));
|
|
}
|
|
|
|
if (m_pTxtPaddleSize != nullptr) {
|
|
Common::sprintf_s(buf, "Paddle Size: %d", m_nPaddleSize);
|
|
m_pTxtPaddleSize->DisplayString(pDC, buf, 14, TEXT_BOLD, RGB(0, 0, 0));
|
|
}
|
|
|
|
ReleaseDC(pDC);
|
|
}
|
|
}
|
|
|
|
bool CUserCfgDlg::OnEraseBkgnd(CDC *) {
|
|
return true;
|
|
}
|
|
|
|
|
|
void CUserCfgDlg::OnClose() {
|
|
if (m_bSave) {
|
|
|
|
SaveIniSettings();
|
|
}
|
|
|
|
if (pOKButton != nullptr) { // release the button
|
|
delete pOKButton;
|
|
pOKButton = nullptr;
|
|
}
|
|
|
|
if (pCancelButton != nullptr) { // release the button
|
|
delete pCancelButton;
|
|
pCancelButton = nullptr;
|
|
}
|
|
|
|
if (pDefaultsButton != nullptr) { // release the button
|
|
delete pDefaultsButton;
|
|
pDefaultsButton = nullptr;
|
|
}
|
|
|
|
assert(m_pTxtPaddleSize != nullptr);
|
|
if (m_pTxtPaddleSize != nullptr) {
|
|
delete m_pTxtPaddleSize;
|
|
m_pTxtPaddleSize = nullptr;
|
|
}
|
|
|
|
assert(m_pTxtBallSpeed != nullptr);
|
|
if (m_pTxtBallSpeed != nullptr) {
|
|
delete m_pTxtBallSpeed;
|
|
m_pTxtBallSpeed = nullptr;
|
|
}
|
|
|
|
assert(m_pTxtStartLevel != nullptr);
|
|
if (m_pTxtStartLevel != nullptr) {
|
|
delete m_pTxtStartLevel;
|
|
m_pTxtStartLevel = nullptr;
|
|
}
|
|
|
|
assert(m_pTxtNumBalls != nullptr);
|
|
if (m_pTxtNumBalls != nullptr) {
|
|
delete m_pTxtNumBalls;
|
|
m_pTxtNumBalls = nullptr;
|
|
}
|
|
|
|
//
|
|
// de-allocate the scroll bars
|
|
//
|
|
assert(m_pScrollBar4 != nullptr);
|
|
if (m_pScrollBar4 != nullptr) {
|
|
delete m_pScrollBar4;
|
|
m_pScrollBar4 = nullptr;
|
|
}
|
|
assert(m_pScrollBar3 != nullptr);
|
|
if (m_pScrollBar3 != nullptr) {
|
|
delete m_pScrollBar3;
|
|
m_pScrollBar3 = nullptr;
|
|
}
|
|
assert(m_pScrollBar2 != nullptr);
|
|
if (m_pScrollBar2 != nullptr) {
|
|
delete m_pScrollBar2;
|
|
m_pScrollBar2 = nullptr;
|
|
}
|
|
assert(m_pScrollBar1 != nullptr);
|
|
if (m_pScrollBar1 != nullptr) {
|
|
delete m_pScrollBar1;
|
|
m_pScrollBar1 = nullptr;
|
|
}
|
|
|
|
if (m_pWallButton != nullptr) {
|
|
delete m_pWallButton;
|
|
m_pWallButton = nullptr;
|
|
}
|
|
|
|
ClearDialogImage();
|
|
EndDialog(0);
|
|
}
|
|
|
|
void CUserCfgDlg::ClearDialogImage() {
|
|
if (pOKButton != nullptr) { // release the button
|
|
delete pOKButton;
|
|
pOKButton = nullptr;
|
|
}
|
|
|
|
if (pCancelButton != nullptr) { // release the button
|
|
delete pCancelButton;
|
|
pCancelButton = nullptr;
|
|
}
|
|
|
|
if (pDefaultsButton != nullptr) { // release the button
|
|
delete pDefaultsButton;
|
|
pDefaultsButton = nullptr;
|
|
}
|
|
|
|
ValidateRect(nullptr);
|
|
}
|
|
|
|
|
|
void CUserCfgDlg::LoadIniSettings() {
|
|
m_nNumBalls = GetPrivateProfileInt(INI_SECTION, "NumberOfBalls", BALLS_DEF, INI_FILENAME);
|
|
if ((m_nNumBalls < BALLS_MIN) || (m_nNumBalls > BALLS_MAX))
|
|
m_nNumBalls = BALLS_DEF;
|
|
|
|
m_nStartLevel = GetPrivateProfileInt(INI_SECTION, "StartingLevel", LEVEL_DEF, INI_FILENAME);
|
|
if ((m_nStartLevel < LEVEL_MIN) || (m_nStartLevel > LEVEL_MAX))
|
|
m_nStartLevel = LEVEL_DEF;
|
|
|
|
m_nBallSpeed = GetPrivateProfileInt(INI_SECTION, "BallSpeed", SPEED_DEF, INI_FILENAME);
|
|
if ((m_nBallSpeed < SPEED_MIN) || (m_nBallSpeed > SPEED_MAX))
|
|
m_nBallSpeed = SPEED_DEF;
|
|
|
|
m_nPaddleSize = GetPrivateProfileInt(INI_SECTION, "PaddleSize", PSIZE_DEF, INI_FILENAME);
|
|
if ((m_nPaddleSize < PSIZE_MIN) || (m_nPaddleSize > PSIZE_MAX))
|
|
m_nPaddleSize = PSIZE_DEF;
|
|
|
|
int outerWall = GetPrivateProfileInt(INI_SECTION, "OutterWall", 0, INI_FILENAME);
|
|
m_bOutterWall = outerWall != 0;
|
|
}
|
|
|
|
void CUserCfgDlg::SaveIniSettings() {
|
|
WritePrivateProfileString(INI_SECTION, "NumberOfBalls", Common::String::format("%d", m_nNumBalls).c_str(), INI_FILENAME);
|
|
WritePrivateProfileString(INI_SECTION, "StartingLevel", Common::String::format("%d", m_nStartLevel).c_str(), INI_FILENAME);
|
|
WritePrivateProfileString(INI_SECTION, "BallSpeed", Common::String::format("%d", m_nBallSpeed).c_str(), INI_FILENAME);
|
|
WritePrivateProfileString(INI_SECTION, "PaddleSize", Common::String::format("%d", m_nPaddleSize).c_str(), INI_FILENAME);
|
|
WritePrivateProfileString(INI_SECTION, "OutterWall", Common::String::format("%d", m_bOutterWall ? 1 : 0).c_str(), INI_FILENAME);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CUserCfgDlg, CBmpDialog)
|
|
ON_WM_CLOSE()
|
|
ON_WM_ERASEBKGND()
|
|
ON_WM_HSCROLL()
|
|
ON_WM_PAINT()
|
|
END_MESSAGE_MAP()
|
|
|
|
} // namespace Fuge
|
|
} // namespace HodjNPodj
|
|
} // namespace Bagel
|