MAZEDLG.C
/*********************************************************************** 
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); 
}