home *** CD-ROM | disk | FTP | other *** search
- /***********************************************************************
- File: MazeDlg.c
-
-
- Abstract:
-
- This module contains dialog boxes for Maze Lords.
-
-
- Contents:
-
- DroneDlg() -- Drone Dialog Box winproc
- AboutDlg() -- About Box
- IntoneDlg() -- Dialog box for spoken messages
- PlayerDlg() -- Dialog box for selecting player picture/maze
- cwCenter() -- Center a given dialog box in the window
-
-
- Revision History:
-
- ************************************************************************/
-
- #include "winmaze.h"
- #include "mazproto.h"
- #include "mazedlg.h"
-
-
-
- int iCurPic,iCurMaze;
-
-
- /*=====================================================================
- Function: DroneDlg()
-
- Inputs: Standard Dialog inputs
-
- Outputs: Returns close status
-
- Abstract:
- This dialog box allows the user to input # of drones and their movement
- speed.
- ======================================================================*/
-
- BOOL FAR PASCAL DroneDlg(
- HWND hWndDlg,
- UINT Message,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- BOOL bRet; // holding variable only.
- UINT uCmdId,uCmdCmd;
- HWND hCmd;
- static INT iOldNumDrones,iOldDroneSpeed;
- int i;
- char c[132];
-
-
- switch(Message) {
- case WM_INITDIALOG:
- cwCenter(hWndDlg, 0);
- iOldNumDrones = iNumDrones;
- iOldDroneSpeed = iDroneSpeed;
- SetDlgItemInt(hWndDlg,DLG_NUMDRONES,iNumDrones,TRUE);
- SetDlgItemInt(hWndDlg,DLG_MOVESPEED,iDroneSpeed,TRUE);
- break;
-
- case WM_CLOSE:
- PostMessage(hWndDlg, WM_COMMAND, IDCANCEL, 0L);
- break;
-
- case WM_COMMAND:
- uCmdId = GET_WM_COMMAND_ID(wParam,lParam);
- uCmdCmd = GET_WM_COMMAND_CMD(wParam,lParam);
- hCmd = GET_WM_COMMAND_HWND(wParam,lParam);
- switch(uCmdId) {
- case DLG_NUMDRONES:
- if (uCmdCmd == EN_CHANGE) {
- i = GetDlgItemInt(hWndDlg,DLG_NUMDRONES,&bRet,TRUE);
- if ((i < 0)||(i > MAX_DRONES)) {
- MessageBeep(MB_ICONHAND);
- sprintf(c,GetStringRes(IDS_FMT_BADNUMDRONES),
- MAX_DRONES);
- MessageBox(hWndDlg,c,GetStringRes(IDS_ERRINPUT),MB_APPLMODAL|MB_ICONHAND);
- SetDlgItemInt(hWndDlg,DLG_NUMDRONES,iOldNumDrones,TRUE);
- }
-
- }
- break;
-
- case DLG_MOVESPEED:
- if (uCmdCmd == EN_CHANGE) {
- i = GetDlgItemInt(hWndDlg,DLG_MOVESPEED,&bRet,TRUE);
- if ((i < 0)||(i > MAX_DRONE_SPEED)) {
- MessageBeep(MB_ICONHAND);
- sprintf(c,GetStringRes(IDS_FMT_BADMOVESPERSEC),
- MAX_DRONE_SPEED);
- MessageBox(hWndDlg,c,GetStringRes(IDS_ERRINPUT),MB_APPLMODAL|MB_ICONHAND);
- SetDlgItemInt(hWndDlg,DLG_MOVESPEED,iOldDroneSpeed,TRUE);
- }
-
- }
- break;
-
- case IDOK:
- iNumDrones = GetDlgItemInt(hWndDlg,DLG_NUMDRONES,&bRet,TRUE);
- iDroneSpeed = GetDlgItemInt(hWndDlg,DLG_MOVESPEED,&bRet,TRUE);
- if ((iOldNumDrones != iNumDrones)&&GameStarted) {
- PostMessage(hWndMaze,WM_COMMAND,IDM_REDRAW,(DWORD)NULL);
- }
-
- EndDialog(hWndDlg, TRUE);
- break;
-
- case IDCANCEL:
- EndDialog(hWndDlg, FALSE);
- break;
- }
- break;
-
- default:
- return FALSE;
- }
-
- return(TRUE);
- }
-
-
-
- /*=====================================================================
- Function: AboutDlg()
-
- Inputs: Standard Dialog box parms
-
- Outputs: Returns close status
-
- Abstract:
- This procedure displays the About dialog box.
- ======================================================================*/
-
- BOOL FAR PASCAL AboutDlg(
- HWND hWndDlg,
- UINT Message,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- UINT uCmdId,uCmdCmd;
- HWND hCmd;
-
- switch(Message) {
-
- case WM_INITDIALOG:
- cwCenter(hWndDlg, 0);
- break;
-
- case WM_CLOSE:
- PostMessage(hWndDlg, WM_COMMAND, IDCANCEL, 0L);
- break;
-
- case WM_COMMAND:
- uCmdId = GET_WM_COMMAND_ID(wParam,lParam);
- uCmdCmd = GET_WM_COMMAND_CMD(wParam,lParam);
- hCmd = GET_WM_COMMAND_HWND(wParam,lParam);
- switch(uCmdId) {
- case IDOK:
- EndDialog(hWndDlg, TRUE);
- break;
- }
- break;
-
- default:
- return FALSE;
- }
-
- return(TRUE);
- }
-
-
- /*=====================================================================
- Function: IntoneDlg()
-
- Inputs: Standard Dialog Box Parms
-
- Outputs: Returns dialog close conditions
-
- Abstract:
- This dialog allows the user to type a message to whisper or shout.
- It is called by both commands, with the loudness having been set
- before the dialog was invoked by the method it was invoked, either
- whispering or shouting.
- ======================================================================*/
-
- BOOL FAR PASCAL IntoneDlg(
- HWND hWndDlg,
- UINT Message,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- IntoneType itTemp;
- BOOL bScratch;
- UINT uCmdId;
-
- switch(Message) {
-
- case WM_INITDIALOG:
- cwCenter(hWndDlg, 0);
- SetDlgItemInt(hWndDlg,DLG_INT_LOUDNESS,iLoudness,TRUE);
- SetDlgItemText(hWndDlg,DLG_INT_SAY,"");
- break;
-
- case WM_CLOSE:
- PostMessage(hWndDlg, WM_COMMAND, IDCANCEL, 0L);
- break;
-
- case WM_COMMAND:
- uCmdId = GET_WM_COMMAND_ID(wParam,lParam);
- switch(uCmdId) {
-
- case DLG_INT_LOUDNESS:
- break;
-
- case DLG_INT_SAY:
- break;
-
- case IDOK:
- GetDlgItemText(hWndDlg,DLG_INT_SAY,itTemp.cBuff,131);
- itTemp.dwLen=lstrlen(itTemp.cBuff);
- iLoudness = GetDlgItemInt(hWndDlg,DLG_INT_LOUDNESS,&bScratch,FALSE);
- itTemp.iLoudness= iLoudness;
- itTemp.Pos = ptSelf.Pos;
- SendNetMessage(0,0,&itTemp,NP_INTONE);
- EndDialog(hWndDlg, TRUE);
- break;
-
- case IDCANCEL:
- EndDialog(hWndDlg, FALSE);
- break;
- }
- break;
-
- default:
- return FALSE;
- }
-
-
- return(TRUE);
- }
-
-
-
- /*=====================================================================
- Function: PlayerDlg()
-
- Inputs: Standard Dialog box parms
-
- Outputs: returns dialog termination condition
-
- Abstract:
- This dialog box uses two custom list-boxes to allow the player to
- select options. The first contains all possible player bitmaps. The
- second contains all possible player sub-grids to choose from.
- ======================================================================*/
-
- BOOL FAR PASCAL PlayerDlg(
- HWND hWndDlg,
- UINT Message,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- int i,j,k,x,y;
- MEASUREITEMSTRUCT FAR *miInfo;
- DRAWITEMSTRUCT FAR *diInfo;
- HDC hDC,hPicDC;
- FullPicType FAR *fptTrav;
- BOOL bFound;
- LPPOINT p;
- //[5*5*5*2+2];
- LPBYTE bType;
- //[5*5*5*2+2],
- BYTE b;
- int iNumPts,Step;
- HGLOBAL hPMem,hBMem;
- float fAspect;
-
-
- switch(Message) {
-
- case WM_INITDIALOG:
- cwCenter(hWndDlg, 0);
-
- iCurPic = iCurMaze = 0;
- if (PIC_DRONE == 0) {
- iCurPic = 1;
- }
- for (i=0;i<NUM_PICS;i++) {
- if (i != PIC_DRONE) {
- AddPic(i);
- SendDlgItemMessage(hWndDlg,PC_DLG_PIC,LB_ADDSTRING,0,i);
- }
- }
- for (i=1;i<NUM_SUBGRIDS-1;i++) {
- SendDlgItemMessage(hWndDlg,PC_DLG_MAZE,LB_ADDSTRING,0,i);
- }
- break;
-
- case WM_MEASUREITEM:
- miInfo = (MEASUREITEMSTRUCT FAR *) lParam;
- miInfo->CtlType = ODT_LISTBOX;
- miInfo->itemID = 0; // Not used
-
- if (wParam == PC_DLG_PIC) {
- miInfo->CtlID = PC_DLG_PIC;
- miInfo->itemWidth = 20;
- miInfo->itemHeight = 45;
- miInfo->itemData = 0;
- }
- else {
- miInfo->CtlID = PC_DLG_MAZE;
- miInfo->itemWidth = 30;
- miInfo->itemHeight = 45;
- miInfo->itemData = 0;
- }
- break;
-
- case WM_DRAWITEM:
-
- diInfo = (DRAWITEMSTRUCT FAR *) lParam;
- hDC = diInfo->hDC;
- switch(diInfo->CtlID) {
-
- case PC_DLG_PIC:
- if (diInfo->itemAction == ODA_DRAWENTIRE) {
- hPicDC = CreateCompatibleDC(hDC);
- fptTrav = &fptPic;
- bFound = FALSE;
- while (fptTrav->next != (FullPicType FAR *)NULL) {
- fptTrav = fptTrav->next;
- if (fptTrav->iPicNum == (int)diInfo->itemData) {
- bFound = TRUE;
- break;
- }
- }
-
- if (bFound) {
- iCurPic = (int)diInfo->itemData;
- SelectObject(hPicDC,fptTrav->P[1].hBitmap);
- x = diInfo->rcItem.right - diInfo->rcItem.left;
- y = diInfo->rcItem.bottom - diInfo->rcItem.top;
- fAspect=((float) fptTrav->P[1].ySize)/
- ((float) fptTrav->P[1].xSize);
-
- StretchBlt(hDC,diInfo->rcItem.left,diInfo->rcItem.top,
- (int) ((x < (y/fAspect))? x : y/fAspect),
- (int) ((y < (x*fAspect))? y : x*fAspect),
- hPicDC,0,0,
- fptTrav->P[1].xSize,
- fptTrav->P[1].ySize,
- SRCCOPY);
- }
-
- DeleteDC(hPicDC);
- }
-
- break;
-
- case PC_DLG_MAZE:
- hPMem = GlobalAlloc(GHND,(3*5*5*4*2 + 5)*sizeof(POINT));
- p = (LPPOINT) GlobalLock(hPMem);
- hBMem = GlobalAlloc(GHND,(3*5*5*4*2 + 5)*sizeof(BYTE));
- bType = (LPBYTE) GlobalLock(hBMem);
-
- if (diInfo->itemAction == ODA_DRAWENTIRE) {
- x = diInfo->rcItem.left;
- y = diInfo->rcItem.top;
- k = (int)diInfo->itemData;
- iNumPts = 0;
- Step = 9;
- iCurMaze = (int)diInfo->itemData;
-
- for (i = 0;i<5; i++) {
- for (j= 0; j<5; j++) {
- b = SubGrids[k].Cell[i][j];
- if (b&NORTH) {
- p[iNumPts].x = i*Step;
- p[iNumPts].y = j*Step;
- bType[iNumPts++] = PT_MOVETO;
- p[iNumPts].x = (i+1)*Step;
- p[iNumPts].y = j*Step;
- bType[iNumPts++] = PT_LINETO;
- }
- if (b&SOUTH) {
- p[iNumPts].x = i*Step;
- p[iNumPts].y = (j+1)*Step;
- bType[iNumPts++] = PT_MOVETO;
- p[iNumPts].x = (i+1)*Step;
- p[iNumPts].y = (j+1)*Step;
- bType[iNumPts++] = PT_LINETO;
- }
- if (b&WEST) {
- p[iNumPts].x = i*Step;
- p[iNumPts].y = j*Step;
- bType[iNumPts++] = PT_MOVETO;
- p[iNumPts].x = i*Step;
- p[iNumPts].y = (j+1)*Step;
- bType[iNumPts++] = PT_LINETO;
- }
- if (b&EAST) {
- p[iNumPts].x = (i+1)*Step;
- p[iNumPts].y = j*Step;
- bType[iNumPts++] = PT_MOVETO;
- p[iNumPts].x = (i+1)*Step;
- p[iNumPts].y = (j+1)*Step;
- bType[iNumPts++] = PT_LINETO;
- }
- }
- }
- PolyDraw95(hDC,p,bType,iNumPts);
- }
-
- GlobalUnlock(hBMem);
- GlobalUnlock(hPMem);
- GlobalFree(hBMem);
- GlobalFree(hPMem);
- break;
-
- default:
- break;
- }
- //BUGBUG -- shouldn't it be hWindow,hDC???
- ReleaseDC((HWND) diInfo->hDC,hDC);
- break;
-
- case WM_CLOSE:
- for(i=0;i<NUM_PICS;i++) {
- if (ptSelf.iPicNum != i) {
- DelPic(i);
- }
- }
- PostMessage(hWndDlg, WM_COMMAND, IDCANCEL, 0L);
- break;
-
- case WM_COMMAND:
- switch(wParam) {
- case IDOK:
- ptSelf.iGridNum = iCurMaze;
- ptSelf.iPicNum = iCurPic;
- EndDialog(hWndDlg, TRUE);
- break;
- case IDCANCEL:
- EndDialog(hWndDlg, FALSE);
- break;
- }
- break;
-
- default:
- return FALSE;
- }
-
- return(TRUE);
- }
-
-
-
- /*=====================================================================
- Function: cwCenter()
-
- Inputs: Handle to window to center, top of window
-
- Outputs: none
-
- Abstract:
- Does a MoveWindow to center the window in question.
- ======================================================================*/
-
- void cwCenter(
- HWND hWnd,
- int top
- )
- {
- POINT pt;
- RECT swp;
- RECT rParent;
- int iwidth;
- int iheight;
-
- GetWindowRect(hWnd, &swp);
- GetClientRect(hWndMain, &rParent);
-
- iwidth = swp.right - swp.left;
- iheight = swp.bottom - swp.top;
-
- pt.x = (rParent.right - rParent.left) / 2;
- pt.y = (rParent.bottom - rParent.top) / 2;
- ClientToScreen(hWndMain, &pt);
-
- pt.x -= (iwidth / 2);
- pt.y -= (iheight / 2);
-
- if (top) {
- pt.y += top;
- }
-
- MoveWindow(hWnd, pt.x, pt.y, iwidth, iheight, FALSE);
- }
-
-