/**********/ /* util.c */ /**********/ #define _WINDOWS #include #include // for HtmlHelp() #include "shellapi.h" // for ShellAbout #include #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; }