areaeditor/
/*
** AreaEditor - a program for editing SMAUG and ROM area files.
** Author: Nick Gammon
** http://www.gammon.com.au/
** See Copyright Notice at the end of AreaEditor.h
*/

// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__30BE0359_E9F1_11D1_A20A_0000B4595568__INCLUDED_)
#define AFX_STDAFX_H__30BE0359_E9F1_11D1_A20A_0000B4595568__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#define VC_EXTRALEAN		// Exclude rarely-used stuff from Windows headers

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxcview.h>
//#include <afxdisp.h>        // MFC OLE automation classes
#include <afxpriv.h>
#include <afxtempl.h>     // for templates

#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>			// MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

#ifdef SPELL_CHECKER
#include "sscemfc.hpp"  // spell check stuff
#endif // SPELL_CHECKER
             
#ifdef WIN32
// disable warnings about long STL-generated names
  #pragma warning( disable : 4786 4800)
#endif

#include <string>
#include <vector>
#include <deque>      
#include <algorithm>  
#include <functional>
#include <iostream>
#include <iterator>
#include <sstream>

using namespace std ;

#include "format.h"
#include "exceptions.h"
#include "constants.h"

// ============================================================================

#if 0

#ifndef INTBITS
  #define INTBITS	32
#endif
#define XBM		31	/* extended bitmask   ( INTBITS - 1 )	*/
#define RSV		5	/* right-shift value  ( sqrt(XBM+1) )	*/
#define XBI		4	/* integers in an extended bitvector	*/
#define MAX_BITS	XBI * INTBITS
/*
 * Structure for extended bitvectors 
 */
struct extended_bitvector
  {
  long		bits[XBI];
  };

typedef struct	extended_bitvector	EXT_BV;

#endif

// My temporary form of extended bitvector - NJG

typedef	__int64	EXT_BV;
#define MAX_BITS	64

#include "FileReadWrite.h"

extern "C"
  {
#include "TipDlg.h"
  }

// function prototypes for minimum string validation in dialog boxes

void AFXAPI DDV_MinMaxString(CDataExchange* pDX, CString& value, int nMinChars, int nMaxChars);
void AFXAPI DDX_MinMaxString(CDataExchange* pDX, int nIDC, CString& value);
void AFXAPI DDV_MinMaxCBString(CDataExchange* pDX, CString& value, int nMinChars, int nMaxChars);
void AFXAPI DDX_MinMaxCBString(CDataExchange* pDX, int nIDC, CString& value);

// clipboard helper function

BOOL putontoclipboard (const CString & data);
BOOL GetClipboardContents (CString & strClipboard);

// The define below gets the current app and casts it to the correct type

#define App (*((CAreaEditorApp*)AfxGetApp()))

// The define below gets the current frame and casts it to the correct type

#define Frame (*((CMainFrame*)App.m_pMainWnd))

// The define below is for easily outputting status message to the status line

#define SetStatusMsg(arg) Frame.SetStatusMessage (arg)


typedef CFont * ptrCFont;     // for changing fonts in edit windows
typedef char * tpNames [];    // for arrays of pointers

// configuration flags structure
typedef struct
  {
  CString strName [MAX_BITS];   // flag name
  CString strDescription [MAX_BITS];  // description of flag
  } tFlags;

// configuration list structure
class tList
  {
  public:
  tList () { iValue = 0; };   // default constructor
  tList (const char * sName, const int iNewValue)
    { strName = sName; iValue = iNewValue; };   // end of constructor
  CString strName;   // flag name
  int     iValue;  // corresponding value
  };

class CConfigList
  {
  public:
  CList <tList, tList&> list;
  bool FindName (const int iValue, 
                 CString & strName,
                 const bool bDefaultToFirst = true) const;     // true if found
  bool IsValueInList (const int iValue) const;     // true if found

  bool FindValue (const CString strName, 
                  int & iValue,
                  const bool bPartialMatch = false) const;  // true if found
  bool IsNameInList (const CString strName,
                     const bool bPartialMatch = false) const;

  CString ReturnName (const EXT_BV iValue,
                      const bool bDefaultToFirst = true) const;    // returns name
  int ReturnValue (const CString strName,
                   const bool bPartialMatch = false) const;  // returns value or 0 if not found
  };

/*
 * Utility macros.
 */
#define UMIN(a, b)		((a) < (b) ? (a) : (b))
#define UMAX(a, b)		((a) > (b) ? (a) : (b))
#define URANGE(a, b, c)		((b) < (a) ? (a) : ((b) > (c) ? (c) : (b)))
#define LOWER(c)		((c) >= 'A' && (c) <= 'Z' ? (c)+'a'-'A' : (c))
#define UPPER(c)		((c) >= 'a' && (c) <= 'z' ? (c)+'A'-'a' : (c))
#define NUMITEMS(arg) (sizeof (arg) / sizeof (arg [0]))
// helper define for appending an "s" to plural amounts
#define PLURAL(arg) (arg), (arg) == 1 ? "" : "s"

#define ENDLINE "\r\n"

#define MAXDESCRIPTIONWIDTH 79

/*
 * Old-style Bit manipulation macros
 *
 * The bit passed is the actual value of the bit (Use the BV## defines)
 */ 

#define IS_SET(flag, bit)	(((flag) & (bit)) != 0)
#define SET_BIT(var, bit)	((var) |= (bit))
#define REMOVE_BIT(var, bit)	((var) &= ~(bit))
#define TOGGLE_BIT(var, bit)	((var) ^= (bit))

// Nick's bit manipulations routines, that require bit numbers, not masks
#define CHECK_BIT_NUMBER(flag, bit) (((flag) & (1 << bit)) != 0)
#define SET_BIT_NUMBER(flag, bit) ((flag) |= (1 << bit))
#define CLEAR_BIT_NUMBER(flag, bit) ((flag) &= ~(1 << bit))
#define TOGGLE_BIT_NUMBER(flag, bit) ((flag) ^= (1 << bit))

#if 0
/*
 * Macros for accessing virtually unlimited bitvectors.		-Thoric
 *
 * Note that these macros use the bit number rather than the bit value
 * itself -- which means that you can only access _one_ bit at a time
 *
 * This code uses an array of integers
 */

/*
 * The functions for these prototypes can be found in misc.c
 * They are up here because they are used by the macros below
 */
bool	ext_is_empty		( EXT_BV *bits );
void	ext_clear_bits	( EXT_BV *bits );
int	ext_has_bits		  ( EXT_BV *var, EXT_BV *bits);
bool	ext_same_bits		( EXT_BV *var, EXT_BV *bits);
void	ext_set_bits		( EXT_BV *var, EXT_BV *bits);
void	ext_remove_bits	( EXT_BV *var, EXT_BV *bits);
void	ext_toggle_bits ( EXT_BV *var, EXT_BV *bits);

/*
 * Here are the extended bitvector macros:
 */
#define xIS_SET(var, bit)	    ((var).bits[(bit) >> RSV] & 1 << ((bit) & XBM))
#define xSET_BIT(var, bit)	  ((var).bits[(bit) >> RSV] |= 1 << ((bit) & XBM))
#define xSET_BITS(var, bit)	  (ext_set_bits(&(var), &(bit)))
#define xREMOVE_BIT(var, bit)	((var).bits[(bit) >> RSV] &= ~(1 << ((bit) & XBM)))
#define xREMOVE_BITS(var, bit)(ext_remove_bits(&(var), &(bit)))
#define xTOGGLE_BIT(var, bit)	((var).bits[(bit) >> RSV] ^= 1 << ((bit) & XBM))
#define xTOGGLE_BITS(var, bit)(ext_toggle_bits(&(var), &(bit)))
#define xCLEAR_BITS(var)	    (ext_clear_bits(&(var)))
#define xIS_EMPTY(var)		    (ext_is_empty(&(var)))
#define xHAS_BITS(var, bit)	  (ext_has_bits(&(var), &(bit)))
#define xSAME_BITS(var, bit)	(ext_same_bits(&(var), &(bit)))

#endif

// macro to help with searches

#define SEARCH(arg)   \
    strFound = arg;  \
    if (!bMatchCase)  \
      strFound.MakeUpper ();  \
    if (strFound.Find (strWanted) != -1)  \
      return TRUE;

void FixFont (ptrCFont & pFont, CEdit & editctrl);

void LoadComboBox (CComboBox & ctlComboBox, 
                   const tpNames pNames, 
                   const int iMaxItems,
                   const int iSelected);

void LoadComboBoxList (CComboBox & ctlComboBox, 
                       const CConfigList & WhichList, 
                       const int iSelected);

bool UnloadComboBox (CComboBox & ctlComboBox, 
                    int & iSelected);

CString flag_string( int bitvector, char * const flagarray[] );

CString convert_actflag (const EXT_BV flag);
CString convert_areaflag (const EXT_BV flag);
CString convert_affectflag (const EXT_BV flag);
CString convert_partflag (const EXT_BV flag);
CString convert_attackflag (const EXT_BV flag);
CString convert_defenseflag (const EXT_BV flag);
CString convert_formflag (const EXT_BV flag);
CString convert_risflag (const EXT_BV flag);
CString convert_languages (const EXT_BV flag);
CString convert_object_flags (const EXT_BV flag);
CString convert_wear_flags (const EXT_BV flag);
CString convert_room_flags (const EXT_BV flag);
CString convert_spell_flags (const EXT_BV flag);
CString convert_exit_flags (const EXT_BV flag);
CString FlagToString (const EXT_BV bitvector, const tFlags & flagarray );

int slot_lookup( int slot );
bool str_prefix (const char *astr, const char *bstr);

int number_fuzzy (int number);
int number_bits (int width);
int number_range (int from, int to);
int number_percent (void);
int number_door (void);
void init_mm (void);
int number_mm (void);
int dice (int number, int size);
int interpolate (int level, int value_00, int value_32);
CString print_bitvector (const EXT_BV & bits);

bool FixWrap (CEdit & ctlEdit, const bool bEndline = true);
void CheckForTilde (CDataExchange* pDX, int nIDC, CString& value);
void FixupVnum (int& iVnum,
                const int * const pOldVnum, 
                const int * const pNewVnum, 
                const int iMax);

int TableLookup (const char * pWhichName,
                 const tpNames pNames, 
                 const int iMaxItems);

CString ConvertROMFlag (const EXT_BV iFlag);
CString Quote (const CString & strName);

void ReadNames (void);
CString GenerateName (void);

// Spell check bits (use with CHECK_BIT_NUMBER macro)
// (stored in App.m_SpellCheckOptions)

enum {
  SK_ENABLE,      // enable spell check
  SK_CHECK_EDIT_WINDOW,   // check when they close edit window
  SK_AREA_CHECK,   // check when they do an area check
  SK_CHECK_ON_VIEW,   // check when they view an item (eg. go from one mob to next)
  SK_ACCEPT_NAME,  // the "name" is considered valid spelling (eg. naga)
  SK_HELP_TEXT,   // check help section text
  SK_MOB_NAME,    // check mob name
  SK_MOB_SHORT,   // check mob short description
  SK_MOB_LONG,    // check mob long description
  SK_MOB_DESC,    // check mob description
  SK_OBJECT_NAME,    // check object name
  SK_OBJECT_SHORT,   // check object short description
  SK_OBJECT_LONG,    // check object long description
  SK_EXTRA_DESC,    // check object and room extra description
  SK_OBJECT_ACTIONDESC,    // check object action description
  SK_ROOM_NAME,    // check room name
  SK_ROOM_DESC,    // check room description
  SK_EXIT_DESC,    // check exit description

  };


// Forward function prototype for delay loading exception filter
LONG WINAPI DelayLoadDllExceptionFilter(PEXCEPTION_POINTERS pep);

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__30BE0359_E9F1_11D1_A20A_0000B4595568__INCLUDED_)