Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

257 lines
6.7 KiB

/**********/
/* 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;
}