dbna/clans/
dbna/councils/
dbna/deity/
dbna/gods/
dbna/houses/
dbna/space/
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"

PLANE_DATA *first_plane, *last_plane;

void do_plist( CHAR_DATA * ch, char *argument )
{
  PLANE_DATA *p;

  send_to_char( "Planes:\n\r-------\n\r", ch );
  for( p = first_plane; p; p = p->next )
    ch_printf( ch, "%s\n\r", p->name );
  return;
}

void do_pstat( CHAR_DATA * ch, char *argument )
{
  PLANE_DATA *p;
  char arg[MAX_INPUT_LENGTH];

  argument = one_argument( argument, arg );
  if( !( p = plane_lookup( arg ) ) )
  {
    send_to_char( "Stat which plane?\n\r", ch );
    return;
  }
  ch_printf( ch, "Name: %s\n\r", p->name );
  return;
}

void do_pset( CHAR_DATA * ch, char *argument )
{
  PLANE_DATA *p;
  char arg[MAX_INPUT_LENGTH];
  char mod[MAX_INPUT_LENGTH];

  argument = one_argument( argument, arg );
  if( !*arg )
  {
    send_to_char( "Syntax: pset <plane> create\n\r", ch );
    send_to_char( "        pset save\n\r", ch );
    send_to_char( "        pset <plane> delete\n\r", ch );
    send_to_char( "        pset <plane> <field> <value>\n\r", ch );
    send_to_char( "\n\r", ch );
    send_to_char( "  Where <field> is one of:\n\r", ch );
    send_to_char( "    name\n\r", ch );
    return;
  }
  if( !str_cmp( arg, "save" ) )
  {
    save_planes(  );
    send_to_char( "Planes saved.\n\r", ch );
    return;
  }

  argument = one_argument( argument, mod );
  p = plane_lookup( arg );

  if( !str_prefix( mod, "create" ) )
  {
    if( p )
    {
      send_to_char( "Plane already exists.\n\r", ch );
      return;
    }
    CREATE( p, PLANE_DATA, 1 );
    p->name = STRALLOC( arg );
    LINK( p, first_plane, last_plane, next, prev );
    send_to_char( "Plane created.\n\r", ch );
    return;
  }
  if( !p )
  {
    send_to_char( "Plane doesn't exist.\n\r", ch );
    return;
  }
  if( !str_prefix( mod, "delete" ) )
  {
    UNLINK( p, first_plane, last_plane, next, prev );
    STRFREE( p->name );
    DISPOSE( p );
    check_planes( p );
    send_to_char( "Plane deleted.\n\r", ch );
    return;
  }
  if( !str_prefix( mod, "name" ) )
  {
    if( plane_lookup( argument ) )
    {
      send_to_char( "Another plane has that name.\n\r", ch );
      return;
    }
    STRFREE( p->name );
    p->name = STRALLOC( argument );
    send_to_char( "Name changed.\n\r", ch );
    return;
  }
  do_pset( ch, "" );
  return;
}

PLANE_DATA *plane_lookup( const char *name )
{
  PLANE_DATA *p;

  for( p = first_plane; p; p = p->next )
    if( !str_cmp( name, p->name ) )
      return p;
  for( p = first_plane; p; p = p->next )
    if( !str_prefix( name, p->name ) )
      return p;
  return NULL;
}

void save_planes( void )
{
  FILE *fp;
  PLANE_DATA *p;

  fclose( fpReserve );

  if( !( fp = fopen( PLANE_FILE, "w" ) ) )
  {
    perror( PLANE_FILE );
    bug( "save_planes: can't open plane file" );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
  }
  for( p = first_plane; p; p = p->next )
  {
    fprintf( fp, "#PLANE\n" );
    fprintf( fp, "Name      %s\n", p->name );
    fprintf( fp, "End\n\n" );
  }
  fprintf( fp, "#END\n" );
  fclose( fp );
  fpReserve = fopen( NULL_FILE, "r" );
  return;
}

#ifdef KEY
#undef KEY
#endif

#define KEY( literal, field, value )					\
				if ( !strcmp( word, literal ) )	\
				{					\
				    field  = value;			\
				    fMatch = TRUE;			\
				    break;				\
				}

void read_plane( FILE * fp )
{
  PLANE_DATA *p;
  char *word;
  bool fMatch;

  CREATE( p, PLANE_DATA, 1 );
  for( ;; )
  {
    word = ( feof( fp ) ? "End" : fread_word( fp ) );
    fMatch = FALSE;

    switch ( UPPER( *word ) )
    {
      case 'E':
        if( !str_cmp( word, "End" ) )
        {
          if( plane_lookup( p->name ) )
          {
            bug( "read_plane: duplicate plane name!" );
            STRFREE( p->name );
            DISPOSE( p );
          }
          else
            LINK( p, first_plane, last_plane, next, prev );
          return;
        }
        break;
      case 'N':
        KEY( "Name", p->name, fread_string( fp ) );
        break;
    }
    if( !fMatch )
    {
      bug( "read_plane: unknown field '%s'", word );
      fread_to_eol( fp );
    }
  }
  return;
}

void load_planes( void )
{
  extern FILE *fpArea;
  extern char strArea[];
  char *word;

  if( !( fpArea = fopen( PLANE_FILE, "r" ) ) )
  {
    perror( PLANE_FILE );
    bug( "load_planes: can't open plane file for read." );
    return;
  }
  strcpy( strArea, PLANE_FILE );

  for( ; !feof( fpArea ); )
  {
    if( fread_letter( fpArea ) != '#' )
    {
      bug( "load_planes: # not found." );
      break;
    }
    word = fread_word( fpArea );
    if( !str_cmp( word, "END" ) )
      break;
    else if( !str_cmp( word, "PLANE" ) )
      read_plane( fpArea );
    else
    {
      bug( "load_planes: invalid section '%s'.", word );
      break;
    }
  }
  fclose( fpArea );
  fpArea = NULL;
  strcpy( strArea, "$" );
  return;
}

void build_prime_plane( void )
{
  PLANE_DATA *p;

  CREATE( p, PLANE_DATA, 1 );
  memset( p, 0, sizeof( *p ) );
  p->name = STRALLOC( "Prime Material" );
  LINK( p, first_plane, last_plane, next, prev );
  return;
}

void check_planes( PLANE_DATA * p )
{
  extern ROOM_INDEX_DATA *room_index_hash[];
  int vnum;
  ROOM_INDEX_DATA *r;

  if( !first_plane )
    build_prime_plane(  );

  for( vnum = 0; vnum < MAX_KEY_HASH; ++vnum )
    for( r = room_index_hash[vnum]; r; r = r->next )
      if( !r->plane || r->plane == p )
        r->plane = first_plane;
  return;
}