// EditWLD module // two-character identifier: ew // **************************************************************************** // Copyright (C) B. Cameron Lesiuk, 1999. All rights reserved. // Permission to use/copy this code is granted for non-commercial use only. // B. Cameron Lesiuk // Victoria, BC, Canada // wi961@freenet.victoria.bc.ca // **************************************************************************** #include<windows.h> #include<windowsx.h> #include<stdio.h> #include<ctl3d.h> #include"moledefs.h" #include"molerc.h" #include"molem.h" #include"dstruct.h" #include"edit.h" #include"dialog.h" #include"areawnd.h" #include"editprop.h" #include"editextr.h" #include"editflag.h" #include"editwld.h" #include"help.h" #include"ctl3dl.h" BOOL CALLBACK _export ewEditWLDProc(HWND p_hWnd, UINT p_message, WPARAM p_wParam, LPARAM p_lParam) { long l_VNum,l_i,l_j; DSSTRUCT *l_thing,*l_edit; char l_buf[40]; BOOL l_changed; DSFTL *l_ftl; DSLWORD l_goto_world=-1; switch (p_message) { case WM_INITDIALOG: Ctl3dSubclassDlgEx(p_hWnd,CTL3D_ALL); dlCascadeDialogBox(p_hWnd); SendDlgItemMessage(p_hWnd,IDC_EDITWLDTYPE,CB_SETEXTENDEDUI,TRUE,0L); /* Title the directions */ for (l_ftl=dsFTLOf(&g_awFTList,MOLE_LIST_DIR),l_i=0;(l_ftl)&&(l_i<IDC_EDITWLDEXITNUMELEMNTS);l_i++,l_ftl=l_ftl->fNext) { SetDlgItemText(p_hWnd,(int)(IDC_EDITWLDD0+(l_i*IDC_EDITWLDEXITNUMELEMNTS)),l_ftl->fName); sprintf(l_buf,"%s Flags",l_ftl->fName); SetDlgItemText(p_hWnd,(int)(IDC_EDITWLDD0+(l_i*IDC_EDITWLDEXITNUMELEMNTS)+5),l_buf); } /* and then fall through to the following ... */ case WM_USER_INITDIALOGSUB: l_VNum=p_lParam; if (l_VNum>=0) { sprintf(l_buf,"%li",l_VNum); SetDlgItemText(p_hWnd,IDC_EDITWLDVIRTUAL,l_buf); } #ifdef WIN32 SetProp(p_hWnd,(LPCSTR)g_edLongHi,(HANDLE)(l_VNum)); #else SetProp(p_hWnd,(LPCSTR)g_edLongHi,HIWORD(l_VNum)); SetProp(p_hWnd,(LPCSTR)g_edLongLo,LOWORD(l_VNum)); #endif RemoveProp(p_hWnd,(LPCSTR)g_edFlag); for (l_i=IDC_EDITWLDACTIVESTART;l_i<=IDC_EDITWLDACTIVEEND;l_i++) { EnableWindow(GetDlgItem(p_hWnd,(int)l_i),FALSE); } for (l_i=0;l_i<IDC_EDITWLDEXITNUMELEMNTS;l_i++) for (l_j=0;l_j<IDC_EDITWLDEXITNUMELEMNTS;l_j++) EnableWindow(GetDlgItem(p_hWnd,(int)(IDC_EDITWLDEXITSTART+IDC_EDITWLDEXITNUMELEMNTS*l_i+l_j)),FALSE); EnableWindow(GetDlgItem(p_hWnd,IDOK),FALSE); return TRUE; case WM_USER_NEWDATA: #ifdef WIN32 l_VNum=(LONG)GetProp(p_hWnd,(LPCSTR)g_edLongHi); #else l_VNum=(LONG)MAKELONG(GetProp(p_hWnd,(LPCSTR)g_edLongLo), GetProp(p_hWnd,(LPCSTR)g_edLongHi)); #endif if (l_VNum<0) { l_VNum=p_lParam; #ifdef WIN32 SetProp(p_hWnd,(LPCSTR)g_edLongHi,(HANDLE)(l_VNum)); #else SetProp(p_hWnd,(LPCSTR)g_edLongHi,(HANDLE)HIWORD(l_VNum)); SetProp(p_hWnd,(LPCSTR)g_edLongLo,(HANDLE)LOWORD(l_VNum)); #endif sprintf(l_buf,"%li",l_VNum); SetDlgItemText(p_hWnd,IDC_EDITWLDVIRTUAL,l_buf); } /* load data from structure into window fields */ l_thing=edWorldOf(l_VNum); if (l_thing) { edSetDlgItemData(p_hWnd,IDC_EDITWLDNAME,&(DSSList(l_thing)->lName),EDSGD_STR,EDSGD_STR_STRIPNL); if (l_thing->sType==DS_STYPE_WORLD) { edSetDlgItemData(p_hWnd,IDC_EDITWLDDESC,&(DSSWorld(l_thing)->wDesc),EDSGD_STR,EDSGD_STR_FORMAT); edSetDlgItemData(p_hWnd,IDC_EDITWLDFLAGS,&(DSSWorld(l_thing)->wFlag),EDSGD_FLAG,0); edSetDlgItemData(p_hWnd,IDC_EDITWLDTYPE,&(DSSWorld(l_thing)->wType),EDSGD_LIST,MOLE_LIST_WTYPE); edSetDlgItemData(p_hWnd,IDC_EDITWLDEXITSTART,&(DSSWorld(l_thing)->wExit),EDSGD_EXIT,MOLE_LIST_DIR); edSetDlgItemData(p_hWnd,IDC_EDITWLDEXTRA,&(DSSWorld(l_thing)->wExtra),EDSGD_EXTRA,0); edSetDlgItemData(p_hWnd,IDC_EDITWLDPROPERTY,&(DSSWorld(l_thing)->wProperty),EDSGD_PROPERTY,0); for (l_i=IDC_EDITWLDACTIVESTART;l_i<=IDC_EDITWLDACTIVEEND;l_i++) { EnableWindow(GetDlgItem(p_hWnd,(int)l_i),TRUE); } EnableWindow(GetDlgItem(p_hWnd,IDOK),TRUE); SetFocus(GetDlgItem(p_hWnd,IDC_EDITWLDNAME)); } } return TRUE; case WM_SYSCOMMAND: #ifdef WIN32 l_VNum=(LONG)GetProp(p_hWnd,(LPCSTR)g_edLongHi); #else l_VNum=(LONG)MAKELONG(GetProp(p_hWnd,(LPCSTR)g_edLongLo), GetProp(p_hWnd,(LPCSTR)g_edLongHi)); #endif switch(p_wParam) /* Process Control Box / Max-Min function */ { case SC_CLOSE: l_thing=edWorldOf(l_VNum); if (l_thing) l_thing->sEditWindow=NULL; aaDestroyWindow(p_hWnd); return TRUE; default: break; } break; case WM_COMMAND: #ifdef WIN32 l_VNum=(LONG)GetProp(p_hWnd,(LPCSTR)g_edLongHi); #else l_VNum=(LONG)MAKELONG(GetProp(p_hWnd,(LPCSTR)g_edLongLo), GetProp(p_hWnd,(LPCSTR)g_edLongHi)); #endif switch (GET_WM_COMMAND_ID(p_wParam,p_lParam)) { case IDC_EDITWLDD0GOTO: case IDC_EDITWLDD1GOTO: case IDC_EDITWLDD2GOTO: case IDC_EDITWLDD3GOTO: case IDC_EDITWLDD4GOTO: case IDC_EDITWLDD5GOTO: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED) break; l_thing=edWorldOf(l_VNum); if (!l_thing) break; l_i=(GET_WM_COMMAND_ID(p_wParam,p_lParam)-IDC_EDITWLDD0GOTO)/IDC_EDITWLDEXITNUMELEMNTS; edGetDlgItemData(p_hWnd,(int)(IDC_EDITWLDEXITSTART+(IDC_EDITWLDEXITNUMELEMNTS*l_i)+1), &l_goto_world,EDSGD_LWORD,0); if (!edWorldOf(l_goto_world)) break; /* change this some day */ /* and flow down into the following */ case IDC_EDITWLDPREVIOUS: case IDC_EDITWLDNEXT: case IDOK: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED) break; l_thing=edWorldOf(l_VNum); if (l_thing) { l_thing->sEditWindow=NULL; /* save data & check for changes to WLD */ l_changed=edGetDlgItemData(p_hWnd,IDC_EDITWLDNAME,&(DSSList(l_thing)->lName),EDSGD_STR,EDSGD_STR_STRIPNL); l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITWLDDESC,&(DSSWorld(l_thing)->wDesc),EDSGD_STR,EDSGD_STR_FORMAT); l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITWLDFLAGS,&(DSSWorld(l_thing)->wFlag),EDSGD_FLAG,0); l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITWLDTYPE,&(DSSWorld(l_thing)->wType),EDSGD_LIST,MOLE_LIST_WTYPE); l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITWLDEXITSTART,&(DSSWorld(l_thing)->wExit),EDSGD_EXIT,MOLE_LIST_DIR); l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITWLDEXTRA,&(DSSWorld(l_thing)->wExtra),EDSGD_EXTRA,0); l_changed|=edGetDlgItemData(p_hWnd,IDC_EDITWLDPROPERTY,&(DSSWorld(l_thing)->wProperty),EDSGD_PROPERTY,0); /* save back to server if changes have been made */ if ((((unsigned int)(GetProp(p_hWnd,(LPCSTR)g_edFlag)))&EDFLAG_CHANGED)||(l_changed)) edSendItem(EDFI_WORLD,NULL,l_thing,NULL); /* now process button click */ if (GET_WM_COMMAND_ID(p_wParam,p_lParam)==IDC_EDITWLDPREVIOUS) { if (l_thing->sPrevious) { l_thing->sEditWindow=NULL; edEditItem(EDFI_WORLD,NULL,l_thing->sPrevious,p_hWnd); } return TRUE; } else if (GET_WM_COMMAND_ID(p_wParam,p_lParam)==IDC_EDITWLDNEXT) { if (l_thing->sNext) { l_thing->sEditWindow=NULL; edEditItem(EDFI_WORLD,NULL,l_thing->sNext,p_hWnd); } return TRUE; } else if (l_goto_world >=0) { if (edWorldOf(l_goto_world)) { l_thing->sEditWindow=NULL; edEditItem(EDFI_WORLD,NULL,edWorldOf(l_goto_world),p_hWnd); } return TRUE; } } aaDestroyWindow(p_hWnd); return TRUE; case IDHELP: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED) break; WinHelp(g_aahWnd,g_aaHelpFile,HELP_CONTEXT,HP_EW_DIALOG_EDITWLD_HELP); return TRUE; case IDCANCEL: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED) break; l_thing=edWorldOf(l_VNum); if (l_thing) l_thing->sEditWindow=NULL; aaDestroyWindow(p_hWnd); return TRUE; case IDC_EDITWLDEXTRANEW: l_thing=edWorldOf(l_VNum); if ((l_thing)&&(l_thing->sType==DS_STYPE_WORLD)) { l_changed=eeEditExtra(p_hWnd,&(DSSWorld(l_thing)->wExtra), DS_STYPE_NONE,DS_STYPE_EXTRA); if (l_changed) { SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd, (LPCSTR)g_edFlag))|EDFLAG_CHANGED)); edSetDlgItemData(p_hWnd,IDC_EDITWLDEXTRA, &(DSSWorld(l_thing)->wExtra),EDSGD_EXTRA,0); } return TRUE; } break; case IDC_EDITWLDEXTRA: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=LBN_DBLCLK) break; /* else fall through to the following */ case IDC_EDITWLDEXTRAEDIT: case IDC_EDITWLDEXTRADELETE: if ((GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)&& (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=LBN_DBLCLK)) break; l_i=SendDlgItemMessage(p_hWnd,IDC_EDITWLDEXTRA,LB_GETCURSEL,0,0L); if (l_i!=LB_ERR) l_i=SendDlgItemMessage(p_hWnd,IDC_EDITWLDEXTRA,LB_GETITEMDATA,(WPARAM)l_i,0L); if (l_i!=LB_ERR) { l_thing=edWorldOf(l_VNum); if ((l_thing)&&((l_thing->sType)==DS_STYPE_WORLD)) { for (l_edit=(DSSWorld(l_thing)->wExtra.rList);(l_edit)&&(l_i); l_edit=l_edit->sNext) { l_i--; } if (l_edit) { l_thing=DSStruct(l_edit->sUpRef); if ((GET_WM_COMMAND_ID(p_wParam,p_lParam)==IDC_EDITWLDEXTRAEDIT)|| (GET_WM_COMMAND_ID(p_wParam,p_lParam)==IDC_EDITWLDEXTRA)) { /* l_edit now points to our property! */ if (eeEditExtra(p_hWnd,l_edit,DS_STYPE_EXTRA,DS_STYPE_EXTRA)) SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED)); } else { /* delete */ dsStructFree(l_edit); SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED)); } edSetDlgItemData(p_hWnd,IDC_EDITWLDEXTRA,l_thing,EDSGD_EXTRA,0); return TRUE; } } } break; case IDC_EDITWLDPROPERTYNEW: l_thing=edWorldOf(l_VNum); if ((l_thing)&&(l_thing->sType==DS_STYPE_WORLD)) { l_changed=epEditProperty(p_hWnd,&(DSSWorld(l_thing)->wProperty), DS_STYPE_NONE,DS_STYPE_PROPERTY); if (l_changed) { SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED)); edSetDlgItemData(p_hWnd,IDC_EDITWLDPROPERTY, &(DSSWorld(l_thing)->wProperty),EDSGD_PROPERTY,0); } return TRUE; } break; case IDC_EDITWLDPROPERTY: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=LBN_DBLCLK) break; /* else fall through to the following */ case IDC_EDITWLDPROPERTYEDIT: case IDC_EDITWLDPROPERTYDELETE: if ((GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED)&& (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=LBN_DBLCLK)) break; l_i=SendDlgItemMessage(p_hWnd,IDC_EDITWLDPROPERTY,LB_GETCURSEL,0,0L); if (l_i!=LB_ERR) l_i=SendDlgItemMessage(p_hWnd,IDC_EDITWLDPROPERTY,LB_GETITEMDATA,(WPARAM)l_i,0L); if (l_i!=LB_ERR) { l_thing=edWorldOf(l_VNum); if ((l_thing)&&((l_thing->sType)==DS_STYPE_WORLD)) { for (l_edit=(DSSWorld(l_thing)->wProperty.rList);(l_edit)&&(l_i); l_edit=l_edit->sNext) { l_i--; } if (l_edit) { l_thing=DSStruct(l_edit->sUpRef); if ((GET_WM_COMMAND_ID(p_wParam,p_lParam)==IDC_EDITWLDPROPERTYEDIT)|| (GET_WM_COMMAND_ID(p_wParam,p_lParam)==IDC_EDITWLDPROPERTY)) { /* l_edit now points to our property! */ if (epEditProperty(p_hWnd,l_edit,DS_STYPE_PROPERTY,DS_STYPE_PROPERTY)) SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED)); } else { /* delete */ SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED)); dsStructFree(l_edit); } edSetDlgItemData(p_hWnd,IDC_EDITWLDPROPERTY,l_thing,EDSGD_PROPERTY,0); return TRUE; } } } break; case IDC_EDITWLDFLAGS: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED) break; l_thing=edWorldOf(l_VNum); if (!l_thing) break; if (efEditFlag(p_hWnd,&(DSSWorld(l_thing)->wFlag),MOLE_LIST_WFLAG,"World Flags")) SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED)); return TRUE; case IDC_EDITWLDD0: case IDC_EDITWLDD1: case IDC_EDITWLDD2: case IDC_EDITWLDD3: case IDC_EDITWLDD4: case IDC_EDITWLDD5: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED) break; /* find direction */ l_i=GET_WM_COMMAND_ID(p_wParam,p_lParam); /* enable/disable this string of windows */ l_changed=(BOOL)IsDlgButtonChecked(p_hWnd,(int)(l_i)); if (l_changed>=0) for (l_j=1;l_j<IDC_EDITWLDEXITNUMELEMNTS;l_j++) EnableWindow(GetDlgItem(p_hWnd,(int)(l_i+l_j)),l_changed); break; case IDC_EDITWLDD0FLAG: case IDC_EDITWLDD1FLAG: case IDC_EDITWLDD2FLAG: case IDC_EDITWLDD3FLAG: case IDC_EDITWLDD4FLAG: case IDC_EDITWLDD5FLAG: if (GET_WM_COMMAND_CMD(p_wParam,p_lParam)!=BN_CLICKED) break; l_thing=edWorldOf(l_VNum); if (!l_thing) break; /* find direction */ l_i=(GET_WM_COMMAND_ID(p_wParam,p_lParam)-IDC_EDITWLDD0FLAG)/(IDC_EDITWLDD1FLAG-IDC_EDITWLDD0FLAG); for(l_edit=DSSWorld(l_thing)->wExit.rList;l_edit;l_edit=l_edit->sNext) if (DSSExit(l_edit)->eDir==l_i) break; if (!l_edit) { SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd, (LPCSTR)g_edFlag))|EDFLAG_CHANGED)); l_edit=dsStructAlloc(DS_STYPE_EXIT); if (!l_edit) break; DSSExit(l_edit)->eDir=(DSBYTE)(l_i); dsStructInsert(&(DSSWorld(l_thing)->wExit), NULL, l_edit); } /* find FTL for this direction so that we can print our direction */ for (l_ftl=dsFTLOf(&g_awFTList,MOLE_LIST_DIR),l_j=0;l_ftl&&(l_j<l_i);l_ftl=l_ftl->fNext,l_j++); if (l_ftl) sprintf(l_buf,"%s Flags",l_ftl->fName); else sprintf(l_buf,"Exit Flags"); if (efEditFlag(p_hWnd,&(DSSExit(l_edit)->eFlag),MOLE_LIST_EFLAG,l_buf)) SetProp(p_hWnd,(LPCSTR)g_edFlag, (HANDLE)(((unsigned int)GetProp(p_hWnd,(LPCSTR)g_edFlag))|EDFLAG_CHANGED)); break; default: break; } break; case WM_DESTROY: RemoveProp(p_hWnd,(LPCSTR)g_edLongHi); #ifndef WIN32 RemoveProp(p_hWnd,(LPCSTR)g_edLongLo); #endif RemoveProp(p_hWnd,(LPCSTR)g_edFlag); break; default: break; } return d3DlgMessageCheck(p_hWnd,p_message,p_wParam,p_lParam); }