/
Crimson2/alias/
Crimson2/area.tmp/
Crimson2/area.tmp/AnomalySpaceDock/
Crimson2/area.tmp/AnomalyStation/
Crimson2/area.tmp/AntHill/
Crimson2/area.tmp/ArcticTerrarium/
Crimson2/area.tmp/BuilderCity/
Crimson2/area.tmp/Dungeon/
Crimson2/area.tmp/MiningDock/
Crimson2/area.tmp/PipeSystem/
Crimson2/area.tmp/RattArea/
Crimson2/area.tmp/RobotFactory/
Crimson2/area.tmp/SilverDale/
Crimson2/area.tmp/StarshipFearless/
Crimson2/area.tmp/StationConduits/
Crimson2/area.tmp/TerrariumAlpha/
Crimson2/area.tmp/TerrariumBeta/
Crimson2/area.tmp/TestArea/
Crimson2/area.tmp/Void/
Crimson2/area/
Crimson2/area/AnomalySpaceDock/
Crimson2/area/AnomalyStation/
Crimson2/area/MiningDock/
Crimson2/area/PipeSystem/
Crimson2/area/SilverDale/
Crimson2/area/StationConduits/
Crimson2/area/Void/
Crimson2/board/
Crimson2/clone/
Crimson2/lib/
Crimson2/mole/
Crimson2/mole/mole_src/HELP/
Crimson2/player/
Crimson2/util/
Crimson2/wldedit/
Crimson2/wldedit/res/
// 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);
}