258 lines
6.7 KiB
C
258 lines
6.7 KiB
C
|
/**********/
|
||
|
/* util.c */
|
||
|
/**********/
|
||
|
|
||
|
#define _WINDOWS
|
||
|
#include <windows.h>
|
||
|
#include <htmlhelp.h> // for HtmlHelp()
|
||
|
#include "shellapi.h" // for ShellAbout
|
||
|
#include <port1632.h>
|
||
|
|
||
|
#include "main.h"
|
||
|
#include "res.h"
|
||
|
#include "pref.h"
|
||
|
#include "util.h"
|
||
|
#include "sound.h"
|
||
|
#include "rtns.h"
|
||
|
#include "string.h"
|
||
|
#include "stdio.h"
|
||
|
#include "stdlib.h"
|
||
|
#include "dos.h"
|
||
|
|
||
|
extern INT dypBorder;
|
||
|
extern INT dxpBorder;
|
||
|
extern INT dypCaption;
|
||
|
extern INT dypMenu;
|
||
|
|
||
|
extern TCHAR szClass[cchNameMax];
|
||
|
extern TCHAR szTime[cchNameMax];
|
||
|
extern TCHAR szDefaultName[cchNameMax];
|
||
|
|
||
|
extern HANDLE hInst;
|
||
|
extern HWND hwndMain;
|
||
|
extern HMENU hMenu;
|
||
|
|
||
|
extern PREF Preferences;
|
||
|
|
||
|
extern HKEY g_hReg;
|
||
|
extern TCHAR * rgszPref[iszPrefMax];
|
||
|
TCHAR szIniFile[] = TEXT("entpack.ini");
|
||
|
|
||
|
|
||
|
/****** R N D ******/
|
||
|
|
||
|
/* Return a random number between 0 and rndMax */
|
||
|
|
||
|
INT Rnd(INT rndMax)
|
||
|
{
|
||
|
return (rand() % rndMax);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/****** R E P O R T E R R ******/
|
||
|
|
||
|
/* Report and error and exit */
|
||
|
|
||
|
VOID ReportErr(WORD idErr)
|
||
|
{
|
||
|
TCHAR szMsg[cchMsgMax];
|
||
|
TCHAR szMsgTitle[cchMsgMax];
|
||
|
|
||
|
if (idErr < ID_ERR_MAX)
|
||
|
LoadString(hInst, idErr, szMsg, cchMsgMax);
|
||
|
else
|
||
|
{
|
||
|
LoadString(hInst, ID_ERR_UNKNOWN, szMsgTitle, cchMsgMax);
|
||
|
wsprintf(szMsg, szMsgTitle, idErr);
|
||
|
}
|
||
|
|
||
|
LoadString(hInst, ID_ERR_TITLE, szMsgTitle, cchMsgMax);
|
||
|
|
||
|
MessageBox(NULL, szMsg, szMsgTitle, MB_OK | MB_ICONHAND);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****** L O A D S Z ******/
|
||
|
|
||
|
VOID LoadSz(WORD id, TCHAR * sz, DWORD cch)
|
||
|
{
|
||
|
if (LoadString(hInst, id, sz, cch) == 0)
|
||
|
ReportErr(1001);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Routines to read the ini file.
|
||
|
|
||
|
INT ReadIniInt(INT iszPref, INT valDefault, INT valMin, INT valMax)
|
||
|
{
|
||
|
return max(valMin, min(valMax,
|
||
|
(INT) GetPrivateProfileInt(szClass, rgszPref[iszPref], valDefault, szIniFile) ) );
|
||
|
}
|
||
|
|
||
|
#define ReadIniBool(iszPref, valDefault) ReadIniInt(iszPref, valDefault, 0, 1)
|
||
|
|
||
|
|
||
|
VOID ReadIniSz(INT iszPref, TCHAR FAR * szRet)
|
||
|
{
|
||
|
GetPrivateProfileString(szClass, rgszPref[iszPref], szDefaultName, szRet, cchNameMax, szIniFile);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/****** I N I T C O N S T ******/
|
||
|
|
||
|
VOID InitConst(VOID)
|
||
|
{
|
||
|
INT iAlreadyPlayed = 0; // have we already updated the registry ?
|
||
|
DWORD dwDisposition;
|
||
|
|
||
|
|
||
|
srand(LOWORD(GetCurrentTime()));
|
||
|
|
||
|
LoadSz(ID_GAMENAME, szClass, ARRAYSIZE(szClass));
|
||
|
LoadSz(ID_MSG_SEC, szTime, ARRAYSIZE(szTime));
|
||
|
LoadSz(ID_NAME_DEFAULT, szDefaultName, ARRAYSIZE(szDefaultName));
|
||
|
|
||
|
dypCaption = GetSystemMetrics(SM_CYCAPTION) + 1;
|
||
|
dypMenu = GetSystemMetrics(SM_CYMENU) + 1;
|
||
|
dypBorder = GetSystemMetrics(SM_CYBORDER) + 1;
|
||
|
dxpBorder = GetSystemMetrics(SM_CXBORDER) + 1;
|
||
|
|
||
|
// Open the registry key;
|
||
|
if (RegCreateKeyEx(HKEY_CURRENT_USER, SZWINMINEREG, 0, NULL, 0, KEY_READ, NULL,
|
||
|
&g_hReg, &dwDisposition) == ERROR_SUCCESS)
|
||
|
{
|
||
|
iAlreadyPlayed = ReadInt(iszPrefAlreadyPlayed, 0, 0, 1);
|
||
|
RegCloseKey(g_hReg);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Read it from the .ini file and write it to registry.
|
||
|
if (!iAlreadyPlayed)
|
||
|
{
|
||
|
Preferences.Height= ReadIniInt(iszPrefHeight,MINHEIGHT,DEFHEIGHT,25);
|
||
|
Preferences.Width= ReadIniInt(iszPrefWidth,MINWIDTH,DEFWIDTH,30);
|
||
|
|
||
|
Preferences.wGameType = (WORD)ReadIniInt(iszPrefGame,wGameBegin, wGameBegin, wGameExpert+1);
|
||
|
Preferences.Mines = ReadIniInt(iszPrefMines, 10, 10, 999);
|
||
|
Preferences.xWindow = ReadIniInt(iszPrefxWindow, 80, 0, 1024);
|
||
|
Preferences.yWindow = ReadIniInt(iszPrefyWindow, 80, 0, 1024);
|
||
|
|
||
|
Preferences.fSound = ReadIniInt(iszPrefSound, 0, 0, fsoundOn);
|
||
|
Preferences.fMark = ReadIniBool(iszPrefMark, fTrue);
|
||
|
Preferences.fTick = ReadIniBool(iszPrefTick, fFalse);
|
||
|
Preferences.fMenu = ReadIniInt(iszPrefMenu, fmenuAlwaysOn, fmenuAlwaysOn, fmenuOn);
|
||
|
|
||
|
Preferences.rgTime[wGameBegin] = ReadIniInt(iszPrefBeginTime, 999, 0, 999);
|
||
|
Preferences.rgTime[wGameInter] = ReadIniInt(iszPrefInterTime, 999, 0, 999);
|
||
|
Preferences.rgTime[wGameExpert] = ReadIniInt(iszPrefExpertTime, 999, 0, 999);
|
||
|
|
||
|
ReadIniSz(iszPrefBeginName, Preferences.szBegin);
|
||
|
ReadIniSz(iszPrefInterName, Preferences.szInter);
|
||
|
ReadIniSz(iszPrefExpertName, Preferences.szExpert);
|
||
|
|
||
|
// set the color preference so we will use the right bitmaps
|
||
|
// numcolors may return -1 on true color devices
|
||
|
{
|
||
|
HDC hDC = GetDC(GetDesktopWindow());
|
||
|
Preferences.fColor = ReadIniBool(iszPrefColor, (GetDeviceCaps(hDC, NUMCOLORS) != 2));
|
||
|
ReleaseDC(GetDesktopWindow(),hDC);
|
||
|
}
|
||
|
|
||
|
if (FSoundOn())
|
||
|
Preferences.fSound = FInitTunes();
|
||
|
|
||
|
// Write it to registry.
|
||
|
WritePreferences();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/* * * * * * M E N U S * * * * * */
|
||
|
|
||
|
/****** C H E C K E M ******/
|
||
|
|
||
|
VOID CheckEm(WORD idm, BOOL fCheck)
|
||
|
{
|
||
|
CheckMenuItem(hMenu, idm, fCheck ? MF_CHECKED : MF_UNCHECKED);
|
||
|
}
|
||
|
|
||
|
/****** S E T M E N U B A R ******/
|
||
|
|
||
|
VOID SetMenuBar(INT fActive)
|
||
|
{
|
||
|
Preferences.fMenu = fActive;
|
||
|
FixMenus();
|
||
|
SetMenu(hwndMain, FMenuOn() ? hMenu : NULL);
|
||
|
AdjustWindow(fResize);
|
||
|
}
|
||
|
|
||
|
|
||
|
/****** D O A B O U T ******/
|
||
|
|
||
|
VOID DoAbout(VOID)
|
||
|
{
|
||
|
TCHAR szVersion[cchMsgMax];
|
||
|
TCHAR szCredit[cchMsgMax];
|
||
|
|
||
|
LoadSz(ID_MSG_VERSION, szVersion, ARRAYSIZE(szVersion));
|
||
|
LoadSz(ID_MSG_CREDIT, szCredit, ARRAYSIZE(szCredit));
|
||
|
|
||
|
ShellAbout(hwndMain,
|
||
|
szVersion, szCredit, LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_MAIN)));
|
||
|
}
|
||
|
|
||
|
|
||
|
/****** D O H E L P ******/
|
||
|
|
||
|
VOID DoHelp(WORD wCommand, UINT lParam)
|
||
|
{
|
||
|
CHAR szHelpFile[cchMaxPathname];
|
||
|
CHAR * pch;
|
||
|
|
||
|
// If we are showing help_onhelp, use the
|
||
|
// nthelp.chm file else use winmine.chm
|
||
|
if (wCommand != HELP_HELPONHELP)
|
||
|
{
|
||
|
/*
|
||
|
* Replace the .exe extension on the complete path with
|
||
|
* the .hlp extension instead.
|
||
|
*/
|
||
|
pch = szHelpFile +
|
||
|
GetModuleFileNameA(hInst, szHelpFile, cchMaxPathname) - 1;
|
||
|
|
||
|
if ( (pch-szHelpFile > 4) &&
|
||
|
(*(pch-3) == '.') ) {
|
||
|
pch -= 3;
|
||
|
}
|
||
|
strcpy(pch, ".chm");
|
||
|
}
|
||
|
else strcpy(szHelpFile, "NTHelp.chm");
|
||
|
|
||
|
HtmlHelpA(GetDesktopWindow(), szHelpFile, lParam, 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/****** G E T D L G I N T ******/
|
||
|
|
||
|
INT GetDlgInt(HWND hDlg, INT dlgID, INT numLo, INT numHi)
|
||
|
{
|
||
|
INT num;
|
||
|
BOOL fFlag;
|
||
|
|
||
|
num = GetDlgItemInt(hDlg, dlgID, &fFlag, fFalse);
|
||
|
|
||
|
if (num < numLo)
|
||
|
num = numLo;
|
||
|
else if (num > numHi)
|
||
|
num = numHi;
|
||
|
|
||
|
return num;
|
||
|
}
|
||
|
|