swfote2.1/.slog/
swfote2.1/backup/u/
swfote2.1/bin/cygwin/
swfote2.1/building/
swfote2.1/doc/mudprogs/
swfote2.1/gods/
swfote2.1/html/profiles/
swfote2.1/player/
swfote2.1/player/u/
 /*********************************************************************************** 
 *                                                                                  *
 *          _______.____    __    ____       _______                  _______       *
 *         /       |\   \  /  \  /   /  _   |   ____|          __    |   ____|      *
 *        |   (----` \   \/    \/   /  (_)  |  |__    ____   _/  |_  |  |__         *
 *         \   \      \            /    _   |   __|  /  _ \  \   __\ |   __|        *
 *     .----)   |      \    /\    /    (_)  |  |    (  <_> )  |  |   |  |____       *
 *     |_______/        \__/  \__/          |__|     \____/   |__|   |_______|      *
 *                                                                                  *
 * SWFotE v2.0 (FotE v1.1 cleaned up and considerably modded)  by:                  *
 * Greg (Keberus) Mosley                                                            *
 * Roman (Trelar) Arnold                                                            *
 *                                                                                  *
 * SWFotE v1 & v1.1 copyright (c) 2002 was created by                               *
 * Chris 'Tawnos' Dary (cadary@uwm.edu),                                            *
 * Korey 'Eleven' King (no email),                                                  *
 * Matt 'Trillen' White (mwhite17@ureach.com),                                      *
 * Daniel 'Danimal' Berrill (danimal924@yahoo.com),                                 *
 * Richard 'Bambua' Berrill (email unknown),                                        *
 * Stuart 'Ackbar' Unknown (email unknown)                                          *
 *                                                                                  *
 * SWR 1.0 copyright (c) 1997, 1998 was created by Sean Cooper                      *
 * based on a concept and ideas from the original SWR immortals:                    *
 * Himself (Durga), Mark Matt (Merth), Jp Coldarone (Exar), Greg Baily (Thrawn),    *
 * Ackbar, Satin, Streen and Bib as well as much input from our other builders      *
 * and players.                                                                     *
 *                                                                                  *
 * Original SMAUG 1.4a written by Thoric (Derek Snider) with Altrag,                *
 * Blodkai, Haus, Narn, Scryn, Swordbearer, Tricops, Gorog, Rennard,                *
 * Grishnakh, Fireblade, and Nivek.                                                 *
 *                                                                                  *
 * Original MERC 2.1 code by Hatchet, Furey, and Kahn.                              *
 *                                                                                  *
 * Original DikuMUD code by: Hans Staerfeldt, Katja Nyboe, Tom Madsen,              *
 * Michael Seifert, and Sebastian Hammer.                                           *
 *                                                                                  *
 ***********************************************************************************/

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
/* #include <stdlib.h> */
#include <time.h>
#include "mud.h"

extern int top_area;
extern int top_r_vnum;
void write_area_list();
void write_starsystem_list();
extern const   char *  sector_name     [SECT_MAX];

PLANET_DATA * first_planet;
PLANET_DATA * last_planet;

GUARD_DATA * first_guard;
GUARD_DATA * last_guard;

/* local routines */
void	fread_planet	args( ( PLANET_DATA *planet, FILE *fp ) );
bool	load_planet_file	args( ( char *planetfile ) );
void	write_planet_list	args( ( void ) );

#ifdef USECARGO
char * const cargo_names[CARGO_MAX] =
{
  "None", "Lommite","Meleenium","Neutronium","Zersium",
  "Steel", "Rhyll","Alazhi"
};
#endif

PLANET_DATA *get_planet( char *name )
{
    PLANET_DATA *planet;
    
    if ( name[0] == '\0' )
       return NULL;
    
    for ( planet = first_planet; planet; planet = planet->next )
       if ( !str_cmp( name, planet->name ) )
         return planet;
    
    for ( planet = first_planet; planet; planet = planet->next )
       if ( nifty_is_name( name, planet->name ) )
         return planet;
    
    for ( planet = first_planet; planet; planet = planet->next )
       if ( !str_prefix( name, planet->name ) )
         return planet;
    
    for ( planet = first_planet; planet; planet = planet->next )
       if ( nifty_is_name_prefix( name, planet->name ) )
         return planet;
    
    return NULL;
}

void write_planet_list( )
{
    PLANET_DATA *tplanet;
    FILE *fpout;
    char filename[256];

    sprintf( filename, "%s%s", PLANET_DIR, PLANET_LIST );
    fpout = fopen( filename, "w" );
    if ( !fpout )
    {
	bug( "FATAL: cannot open planet.lst for writing!\n\r", 0 );
 	return;
    }	  
    for ( tplanet = first_planet; tplanet; tplanet = tplanet->next )
	fprintf( fpout, "%s\n", tplanet->filename );
    fprintf( fpout, "$\n" );
    fclose( fpout );
}

void save_planet( PLANET_DATA *planet )
{
    FILE *fp;
    char filename[256];
    char buf[MAX_STRING_LENGTH];
#ifdef USECARGO
    int i = 0;
#endif

    if ( !planet )
    {
	bug( "save_planet: null planet pointer!", 0 );
	return;
    }
        
    if ( !planet->filename || planet->filename[0] == '\0' )
    {
	sprintf( buf, "save_planet: %s has no filename", planet->name );
	bug( buf, 0 );
	return;
    }
 
    sprintf( filename, "%s%s", PLANET_DIR, planet->filename );
    
    fclose( fpReserve );
    if ( ( fp = fopen( filename, "w" ) ) == NULL )
    {
    	bug( "save_planet: fopen", 0 );
    	perror( filename );
    }
    else
    {
        AREA_DATA *pArea;
        
	fprintf( fp, "#PLANET\n" );
	fprintf( fp, "Name         %s~\n",	planet->name		);
	fprintf( fp, "Filename     %s~\n",	planet->filename        );
	fprintf( fp, "X            %d\n",	planet->x               );
	fprintf( fp, "Y            %d\n",	planet->y               );
	fprintf( fp, "Z            %d\n",	planet->z               );
	fprintf( fp, "Sector       %d\n",	planet->sector          );
	fprintf( fp, "Type    	   %d\n",	planet->controls );
	fprintf( fp, "PopSupport   %d\n",	(int) (planet->pop_support)      );
	if ( planet->starsystem && planet->starsystem->name )
        	fprintf( fp, "Starsystem   %s~\n",	planet->starsystem->name);
	if ( planet->governed_by && planet->governed_by->name )
        	fprintf( fp, "GovernedBy   %s~\n",	planet->governed_by->name);
	//pArea = planet->area;
	//if (pArea->filename)
         //	fprintf( fp, "Area         %s~\n",	pArea->filename  );
        for ( pArea = planet->first_area; pArea; pArea = pArea->next_on_planet ) 
          fprintf( fp, "Area         %s~\n",	pArea->filename  );

    for(i = 1; i<CARGO_MAX; i++)
     {
       fprintf(fp, "Resource %d %d %d %d %d %d\n", i, planet->import[i], planet->export[i], planet->resource[i], planet->consumes[i], planet->produces[i]);
     }

	fprintf( fp, "End\n\n"						);
	fprintf( fp, "#END\n"						);
    }
    fclose( fp );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
}

#if defined(KEY)
#undef KEY
#endif

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


void fread_planet( PLANET_DATA *planet, FILE *fp )
{
    char buf[MAX_STRING_LENGTH];
    char *word;
    char *line;
    int x0,x1,x2,x3,x4,x5;
    bool fMatch;

    for ( ; ; )
    {
	word   = feof( fp ) ? "End" : fread_word( fp );
	fMatch = FALSE;

	switch ( UPPER(word[0]) )
	{
	case '*':
	    fMatch = TRUE;
	    fread_to_eol( fp );
	    break;

	case 'A':
/*	    if ( !str_cmp( word, "Area" ) )
	    {
	        char aName[MAX_STRING_LENGTH];
                AREA_DATA *pArea;
                	        
	     	sprintf (aName, fread_string(fp));
		for( pArea = first_area ; pArea ; pArea = pArea->next )
	          if (pArea->filename && !str_cmp(pArea->filename , aName ) )
	          {
	             ROOM_INDEX_DATA *room;
	             
	             planet->size = 0;
	             planet->citysize = 0;
	             planet->wilderness = 0;
	             planet->farmland = 0;
	             planet->barracks = 0;
	             planet->controls = 0;
	             pArea->planet = planet; 
	             planet->area = pArea;
	             for( room = pArea->first_room ; room ; room = room->next_in_area )
                     {  	       
                       	  planet->size++;
                          if ( room->sector_type <= SECT_CITY )
                             planet->citysize++;    
                          else if ( room->sector_type == SECT_FARMLAND )
                             planet->farmland++;    
                          else if ( room->sector_type != SECT_DUNNO )
                             planet->wilderness++;
                             
                          if ( IS_SET( room->room_flags , ROOM_CONTROL ))
                             planet->controls++;    
                          if ( IS_SET( room->room_flags , ROOM_BARRACKS ))
                             planet->barracks++;    
                     } 	       
	          }      */
                //fMatch = TRUE;
	    //}
	    if ( !str_cmp( word, "area" ) )
	    {
	     	planet->area = get_area ( fread_string(fp) );
                if (planet->area)
                {
                     AREA_DATA *area = planet->area;
                     area->planet = planet;
                     LINK( area , planet->first_area, planet->last_area, next_on_planet, prev_on_planet );
                }
                fMatch = TRUE;
	    }
	    
	    break;

	case 'E':
	    if ( !str_cmp( word, "End" ) )
	    {
		if (!planet->name)
		  planet->name		= STRALLOC( "" );
		return;
	    }
	    break;

	case 'F':
	    KEY( "Filename",	planet->filename,		fread_string_nohash( fp ) );
	    break;
	
	case 'G':
	    if ( !str_cmp( word, "GovernedBy" ) )
	    {
	     	planet->governed_by = get_clan ( fread_string(fp) );
                fMatch = TRUE;
	    }
	    break;
	
	case 'N':
	    KEY( "Name",	planet->name,		fread_string( fp ) );
	    break;
	
	case 'P':
	    KEY( "PopSupport",	planet->pop_support,		fread_float( fp ) );
	    break;

      case 'R':
          if( !str_cmp( word, "Resource" ) );
          {
             line = fread_line(fp);
             x0=x1=x2=x3=x4=x5=0;
             sscanf(line, "%d %d %d %d %d %d\n",
                    &x0, &x1, &x2, &x3, &x4, &x5);
             planet->import[x0] = x1;
             planet->export[x0] = x2;
             planet->resource[x0] = x3;
             planet->consumes[x0] = x4;
             planet->produces[x0] = x5;
          }
          break;

	case 'S':
	    KEY( "Sector",	planet->sector,		fread_number( fp ) );
	    if ( !str_cmp( word, "Starsystem" ) )
	    {
	     	planet->starsystem = starsystem_from_name ( fread_string(fp) );
                if (planet->starsystem)
                {
                     SPACE_DATA *starsystem = planet->starsystem;
                     
                     LINK( planet , starsystem->first_planet, starsystem->last_planet, next_in_system, prev_in_system );
                }
                fMatch = TRUE;
	    }
	    break;
	case 'T':
	    KEY("Type", planet->controls,	fread_number(fp) );
		break;
	case 'X':
	    KEY( "X",	planet->x,		fread_number( fp ) );
	    break;

	case 'Y':
	    KEY( "Y",	planet->y,		fread_number( fp ) );
	    break;

	case 'Z':
	    KEY( "Z",	planet->z,		fread_number( fp ) );
	    break;
    
	}
	
	if ( !fMatch )
	{
	    sprintf( buf, "Fread_planet: no match: %s", word );
	    bug( buf, 0 );
	}
	
    }
}

bool load_planet_file( char *planetfile )
{
    char filename[256];
    PLANET_DATA *planet;
    FILE *fp;
    bool found;

    CREATE( planet, PLANET_DATA, 1 );
    
    planet->governed_by = NULL;
    planet->next_in_system = NULL;
    planet->prev_in_system = NULL;
    planet->starsystem = NULL ;
    planet->area = NULL;
    planet->first_guard = NULL;
    planet->last_guard = NULL;
    
    found = FALSE;
    sprintf( filename, "%s%s", PLANET_DIR, planetfile );

    if ( ( fp = fopen( filename, "r" ) ) != NULL )
    {

	found = TRUE;
	for ( ; ; )
	{
	    char letter;
	    char *word;

	    letter = fread_letter( fp );
	    if ( letter == '*' )
	    {
		fread_to_eol( fp );
		continue;
	    }

	    if ( letter != '#' )
	    {
		bug( "Load_planet_file: # not found.", 0 );
		break;
	    }

	    word = fread_word( fp );
	    if ( !str_cmp( word, "PLANET"	) )
	    {
	    	fread_planet( planet, fp );
	    	break;
	    }
	    else
	    if ( !str_cmp( word, "END"	) )
	        break;
	    else
	    {
		char buf[MAX_STRING_LENGTH];

		sprintf( buf, "Load_planet_file: bad section: %s.", word );
		bug( buf, 0 );
		break;
	    }
	}
	fclose( fp );
    }

    if ( !found )
      DISPOSE( planet );
    else
      LINK( planet, first_planet, last_planet, next, prev );

    return found;
}

void load_planets( )
{
    FILE *fpList;
    char *filename;
    char planetlist[256];
    char buf[MAX_STRING_LENGTH];
    
    first_planet	= NULL;
    last_planet	= NULL;

    log_string( "Loading planets..." );

    sprintf( planetlist, "%s%s", PLANET_DIR, PLANET_LIST );
    fclose( fpReserve );
    if ( ( fpList = fopen( planetlist, "r" ) ) == NULL )
    {
	perror( planetlist );
	exit( 1 );
    }

    for ( ; ; )
    {
	filename = feof( fpList ) ? "$" : fread_word( fpList );
	log_string( filename );
	if ( filename[0] == '$' )
	  break;

	if ( !load_planet_file( filename ) )
	{
	  sprintf( buf, "Cannot load planet file: %s", filename );
	  bug( buf, 0 );
	}
    }
    fclose( fpList );
    log_string(" Done planets " );  
    fpReserve = fopen( NULL_FILE, "r" );
    return;
}

AREA_DATA *get_area(char *argument){
  AREA_DATA *pArea;
    for( pArea = first_area ; pArea ; pArea = pArea->next )
      if (pArea->filename && !str_cmp(pArea->filename , argument ) )
        return pArea;
   
   return NULL;
}

void do_setplanet( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    PLANET_DATA *planet;
#ifdef USECARGO
    int i=0;
    char arg3[MAX_INPUT_LENGTH];
#endif

    if ( IS_NPC( ch ) )
    {
	send_to_char( "Huh?\n\r", ch );
	return;
    }

    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );

    if ( arg1[0] == '\0' )
    {
	send_to_char( "Usage: setplanet <planet> <field> [value]\n\r", ch );
	send_to_char( "\n\rField being one of:\n\r", ch );
	send_to_char( " name filename area starsystem governed_by x y z\n\r", ch );
#ifdef USECARGO 
        send_to_char( " import  export   resource   produces  consumes\n\r", ch ); 
#endif
	return;
    }

    planet = get_planet( arg1 );
    if ( !planet )
    {
	send_to_char( "No such planet.\n\r", ch );
	return;
    }


    if ( !strcmp( arg2, "name" ) )
    {
	STRFREE( planet->name );
	planet->name = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_planet( planet );
	return;
    }
    if( !strcmp(arg2, "type") )
    {
 	if(!argument)  planet->controls = 0;
	else 		planet->controls = atoi(argument);
	send_to_char("Done.\n\r", ch);
	save_planet(planet);
	return;
    }
    if ( !strcmp( arg2, "sector" ) )
    {
	planet->sector = atoi(argument);
	send_to_char( "Done.\n\r", ch );
	save_planet( planet );
	return;
    }

    if ( !strcmp( arg2, "area")){
    	planet->area = get_area ( argument );
        if (planet->area)
        {
           AREA_DATA *area = planet->area;                     
           LINK( area , planet->first_area, planet->last_area, next_on_planet, prev_on_planet );
         }
         send_to_char( "Done.\n\r", ch ); 
       	 save_planet( planet );          
       	 return;
    }    

    if ( !strcmp( arg2, "governed_by" ) )
    {
        CLAN_DATA *clan;
        clan = get_clan( argument );
        if ( clan )
        { 
           planet->governed_by = clan;
           send_to_char( "Done.\n\r", ch ); 
       	   save_planet( planet );
        }
        else
           send_to_char( "No such clan.\n\r", ch ); 
	return;
    }

    if ( !strcmp( arg2, "starsystem" ) )
    {
        SPACE_DATA *starsystem;
        
        if ((starsystem=planet->starsystem) != NULL)
          UNLINK(planet, starsystem->first_planet, starsystem->last_planet, next_in_system, prev_in_system);
	if ( (planet->starsystem = starsystem_from_name(argument)) )
        {
           starsystem = planet->starsystem;
           LINK(planet, starsystem->first_planet, starsystem->last_planet, next_in_system, prev_in_system);	
           send_to_char( "Done.\n\r", ch );
	}
	else 
	       	send_to_char( "No such starsystem.\n\r", ch );
	save_planet( planet );
	return;
    }

    if ( !strcmp( arg2, "x" ) )
    {
        planet->x = atoi(argument);
	send_to_char( "Done.\n\r", ch );
	save_planet( planet );
	write_planet_list( );
	return;

    }

    if ( !strcmp( arg2, "y" ) )
    {
        planet->y = atoi(argument);
	send_to_char( "Done.\n\r", ch );
	save_planet( planet );
	write_planet_list( );
	return;

    }

    if ( !strcmp( arg2, "z" ) )
    {
        planet->z = atoi(argument);
	send_to_char( "Done.\n\r", ch );
	save_planet( planet );
	write_planet_list( );
	return;

    }
#ifdef USECARGO
if ( !strcmp( arg2, "import")) 
    { 
    argument = one_argument( argument, arg3 );

       for (i = 0; i < CARGO_MAX; i++) 
       { 
          if (!str_cmp( arg3, cargo_names[i])) 
          { 
             planet->import[i] = atoi(argument); 
             planet->export[i] = 0; 
             send_to_char("done.\n\r", ch ); 
             save_planet( planet ); 
             return; 
          } 
       } 
       send_to_char("No such resource type\r\n", ch); 
       return; 
    } 

    if ( !strcmp( arg2, "export")) 
    { 
    argument = one_argument( argument, arg3 ); 

       for (i = 0; i < CARGO_MAX; i++) 
       { 
          if (!str_cmp( arg3, cargo_names[i])) 
          { 
             planet->export[i] = atoi(argument); 
             planet->import[i] = 0; 
             send_to_char("done.\n\r", ch ); 
             save_planet( planet ); 
             return; 
          } 
       } 
       send_to_char("No such resource type\r\n", ch); 
       return; 
    } 

    if ( !strcmp( arg2, "resource")) 
    { 
    argument = one_argument( argument, arg3 ); 

       for (i = 0; i < CARGO_MAX; i++) 
       { 
          if (!str_cmp( arg3, cargo_names[i])) 
          { 
             planet->resource[i] = atoi(argument); 
             send_to_char("done.\n\r", ch ); 
             save_planet( planet ); 
             return; 
          } 
       } 
       send_to_char("No such resource type\r\n", ch); 
       return; 
    } 

    if ( !strcmp( arg2, "produces")) 
    { 
    argument = one_argument( argument, arg3 ); 

       for (i = 0; i < CARGO_MAX; i++) 
       { 
          if (!str_cmp( arg3, cargo_names[i])) 
          { 
             planet->produces[i] = atoi(argument); 
             send_to_char("done.\n\r", ch ); 
             save_planet( planet ); 
             return; 
          } 
       } 
       send_to_char("No such resource type\r\n", ch); 
       return; 
    } 

    if ( !strcmp( arg2, "consumes")) 
    { 
    argument = one_argument( argument, arg3 ); 

       for (i = 0; i < CARGO_MAX; i++) 
       { 
          if (!str_cmp( arg3, cargo_names[i])) 
          { 
             planet->consumes[i] = atoi(argument); 
             send_to_char("done.\n\r", ch ); 
             save_planet( planet ); 
             return; 
          } 
       } 
       send_to_char("No such resource type\r\n", ch); 
       return; 
    }
#endif    

    if ( !strcmp( arg2, "filename" ) )
    {
	DISPOSE( planet->filename );
	planet->filename = str_dup( argument );
	send_to_char( "Done.\n\r", ch );
	save_planet( planet );
	write_planet_list( );
	return;
    }


    do_setplanet( ch, "" );
    return;
}

void do_showplanet( CHAR_DATA *ch, char *argument )
{   
    GUARD_DATA * guard;
    PLANET_DATA *planet;
    AREA_DATA *pArea;
    char area[MAX_STRING_LENGTH];
    int num_guards = 0;
    int pf = 0;
    int pc = 0;
    int pw = 0;
    
    if ( IS_NPC( ch ) )
    {
	send_to_char( "Huh?\n\r", ch );
	return;
    }

    if ( argument[0] == '\0' )
    {
	send_to_char( "Usage: showplanet <planet>\n\r", ch );
	return;
    }

    planet = get_planet( argument );
    if ( !planet )
    {
	send_to_char( "No such planet.\n\r", ch );
	return;
    }

    for ( guard = planet->first_guard ; guard ; guard = guard->next_on_planet )
        num_guards++;

    if ( planet->size > 0 )
    {
       float tempf;
       
       tempf = planet->citysize;
       pc = tempf / planet->size *  100;

       tempf = planet->wilderness;
       pw = tempf / planet->size *  100;

       tempf = planet->farmland;
       pf = tempf / planet->size *  100;    
    }
    
    ch_printf( ch, "&W%s\n\r", planet->name);
    if ( IS_IMMORTAL(ch) )
          ch_printf( ch, "&WFilename: &G%s\n\r", planet->filename);
    ch_printf( ch, "&WStarsystem: &G%s\n\r", (planet->starsystem && planet->starsystem->name) ? planet->starsystem->name : "(null)");    
    ch_printf( ch, "&WTerrain: &G%s\n\r", 
                   sector_name[planet->sector]  );
    ch_printf( ch, "&WGoverned by: &G%s\n\r", 
                   planet->governed_by ? planet->governed_by->name : "" );
    ch_printf( ch, "&WPlanet Size: &G%d\n\r", 
                   planet->size );
    ch_printf( ch, "&WPercent Civilized: &G%d\n\r", pc ) ;
    ch_printf( ch, "&WPercent Wilderness: &G%d\n\r", pw ) ;
    ch_printf( ch, "&WPercent Farmland: &G%d\n\r", pf ) ;
    ch_printf( ch, "&WBarracks: &G%d\n\r", planet->barracks );
    ch_printf( ch, "&WPatrols: &G%d&W/%d\n\r", num_guards , planet->barracks*5 );
    ch_printf( ch, "&WPopulation: &G%d&W\n\r", planet->population );
    ch_printf( ch, "&WPopular Support: &G%.2f\n\r", 
                   planet->pop_support );
    ch_printf( ch, "&WCurrent Monthly Revenue: &G%ld\n\r", 
                   get_taxes( planet) );
    area[0] = '\0';
    for ( pArea = planet->first_area; pArea; pArea = pArea->next_on_planet ){
      strcat(area, pArea->filename);
      strcat(area, ", ");
    }
    ch_printf( ch, "&WAreas: &G%s\n\r", area);
    if ( IS_IMMORTAL(ch) && !planet->area )
    {
          ch_printf( ch, "&RWarning - this planet is not attached to an area!&G");
          ch_printf( ch, "\n\r" );
    }         
    
    return;
}


void do_makeplanet( CHAR_DATA *ch, char *argument )
{
    char filename[256];
    PLANET_DATA *planet;
    bool found;

    if ( !argument || argument[0] == '\0' )
    {
	send_to_char( "Usage: makeplanet <planet name>\n\r", ch );
	return;
    }

    found = FALSE;
    sprintf( filename, "%s%s", PLANET_DIR, strlower(argument) );

    CREATE( planet, PLANET_DATA, 1 );
    LINK( planet, first_planet, last_planet, next, prev );
    planet->governed_by = NULL;
    planet->next_in_system = NULL;
    planet->prev_in_system = NULL;
    planet->starsystem = NULL ;
    planet->first_area = NULL;
    planet->last_area = NULL;
    planet->first_guard = NULL;
    planet->last_guard = NULL;
    planet->name		= STRALLOC( argument );
    planet->flags               = 0;
}


void do_planets( CHAR_DATA *ch, char *argument )
{
    PLANET_DATA *planet;
    int count = 0;
    SPACE_DATA *starsystem;
    
    set_char_color( AT_WHITE, ch );
    send_to_char( "Planet             Starsystem    Governed By                  Popular Support\n\r" , ch );
    
    for ( starsystem = first_starsystem ; starsystem; starsystem = starsystem->next )    
     for ( planet = starsystem->first_planet; planet; planet = planet->next_in_system )
     {
	if(planet->controls != 0) continue;
        ch_printf( ch, "&G%-18s %-12s  %-25s    ", 
                   planet->name , starsystem->name , 
                   planet->governed_by ? planet->governed_by->name : "" );
        ch_printf( ch, "%.1f\n\r", planet->pop_support );
        if ( IS_IMMORTAL(ch) && !planet->area )
        {
          ch_printf( ch, "&RWarning - this planet is not attached to an area!&G");
          ch_printf( ch, "\n\r" );
        }         
        
        count++;
     }
            
    for ( planet = first_planet; planet; planet = planet->next )
    {
        if ( planet->starsystem )
           continue;
           
        ch_printf( ch, "&G%-15s %-12s  %-25s    ", 
                   planet->name , "", 
                   planet->governed_by ? planet->governed_by->name : "" );
        ch_printf( ch, "%.1f\n\r", 
			!str_cmp(planet->governed_by->name, "Neutral") ? 100.0 : planet->pop_support );
        if ( IS_IMMORTAL(ch) && !planet->area )
        {
          ch_printf( ch, "&RWarning - this planet is not attached to an area!&G");
          ch_printf( ch, "\n\r" );
        }         
        
        count++;
    }

    if ( !count )
    {
	set_char_color( AT_BLOOD, ch);
        send_to_char( "There are no planets currently formed.\n\r", ch );
    }
    send_to_char( "&WUse SHOWPLANET for more information.\n\r", ch );
    
}

void do_capture ( CHAR_DATA *ch , char *argument )
{
   CLAN_DATA *clan;
   PLANET_DATA *planet;
   PLANET_DATA *cPlanet;
   float support = 0.0;
   int pCount = 0;   
   char buf[MAX_STRING_LENGTH];
   
   if ( !ch->in_room || !ch->in_room->area)
      return;   

   if ( IS_NPC(ch) || !ch->pcdata )
   {
       send_to_char ( "huh?\n\r" , ch );
       return;
   }
   
   if ( !ch->pcdata->clan )
   {
       send_to_char ( "You need to be a member of an organization to do that!\n\r" , ch );
       return;
   }
   
   clan = ch->pcdata->clan;
      
   if ( ( planet = ch->in_room->area->planet ) == NULL )
   {
       send_to_char ( "You must be on a planet to capture it.\n\r" , ch );
       return;
   }   
   
   if ( clan == planet->governed_by )
   {
       send_to_char ( "Your organization already controls this planet.\n\r" , ch );
       return;
   }

   if ( clan->clan_type == CLAN_CRIME || clan->clan_type == CLAN_GUILD )
   {
        send_to_char( "Your clan can't capture planets!\n\r", ch);
        return;
   }

   if ( planet->starsystem )
   {
       SHIP_DATA *ship;
       CLAN_DATA *sClan;
              
       for ( ship = planet->starsystem->first_ship ; ship ; ship = ship->next_in_starsystem )
       {
          sClan = get_clan(ship->owner);
          if ( !sClan ) 
             continue;
          if ( sClan == planet->governed_by )
          {
             send_to_char ( "A planet cannot be captured while protected by orbiting spacecraft.\n\r" , ch );
             return;
          }
       }
   }
   
   if ( planet->first_guard )
   {
       send_to_char ( "This planet is protected by soldiers.\n\r" , ch );
       send_to_char ( "You will have to eliminate all enemy forces before you can capture it.\n\r" , ch );
       return;
   }
  if(planet->governed_by->name && planet->governed_by->name != NULL)
	{
   if(!str_cmp(planet->governed_by->name, "Neutral"))
	{
	   send_to_char("This planet cannot be captured.\n\r", ch);
	   return;
	}
	}
   if ( planet->pop_support > 0 )
   {
       send_to_char ( "The population is not in favour of changing leaders right now.\n\r" , ch );
       return;
   }
   
   for ( cPlanet = first_planet ; cPlanet ; cPlanet = cPlanet->next )
        if ( clan == cPlanet->governed_by )
        {
            pCount++;
            support += cPlanet->pop_support;
        }
   
   if ( support < 0 )
   {
       send_to_char ( "There is not enough popular support for your organization!\n\rTry improving loyalty on the planets that you already control.\n\r" , ch );
       return;
   }
   
   planet->governed_by = clan;
   planet->pop_support = 50;
   
   sprintf( buf , "%s has been captured by %s!", planet->name, clan->name );   
   echo_to_all( AT_RED , buf , 0 );
   
   save_planet( planet );
      
   return; 
}

long get_taxes( PLANET_DATA *planet )
{
      long gain;
      
      gain = planet->base_value;
      gain += planet->base_value*(planet->pop_support/100);
      gain += (planet->population * 150);
      gain += UMAX(0, planet->pop_support/10 * (planet->population * 20));
      
      return gain;
}

#ifdef USECARGO
void do_imports( CHAR_DATA *ch, char *argument )
{
   PLANET_DATA *planet;
   int i;

   if (argument[0] == '\0')
   {
      send_to_char("Usage: imports <planet>\r\n", ch);
      return;
   }

   planet = get_planet( argument );

   if (!planet)
   {
      send_to_char("&RNo such planet\r\n", ch);
      return;
   }
   ch_printf(ch,"&BImport and Export data for %s:\r\n", planet->name);
   ch_printf(ch,"&GResource    &CImport     &YExport    &PProduces    &RConsumes         &GAmount\r\n");
   ch_printf(ch, "&G----------   ------     ------    --------    --------          ------\r\n");
   for (i = 1; i < CARGO_MAX; i++)
   ch_printf(ch,"&G%-10.10s    &C%5d/ton  &Y%5d/ton &P%6d tons  &R%6d tons  &G%9d\r\n",
             cargo_names[i], planet->import[i], planet->export[i],
             planet->produces[i], planet->consumes[i], planet->resource[i]);
   return;
}
#endif