#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
/* #include <stdlib.h> */
#include <time.h>
#include "mud.h"
PLANET_DATA * first_planet;
PLANET_DATA * last_planet;
GUARD_DATA * first_guard;
GUARD_DATA * last_guard;
void fread_planet args( ( PLANET_DATA *planet, FILE *fp ) );
bool load_planet_file args( ( char *planetfile ) );
void write_planet_list args( ( void ) );
PLANET_DATA *get_planet( char *name )
{
PLANET_DATA *planet;
for ( planet = first_planet; planet; planet = planet->next )
if ( !str_cmp( 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];
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, "BaseValue %ld\n", planet->base_value );
fprintf( fp, "Flags %d\n", planet->flags );
fprintf( fp, "PopSupport %.0f\n", 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);
for( pArea = planet->first_area ; pArea ; pArea = pArea->next_on_planet )
if (pArea->filename)
fprintf( fp, "Area %s~\n", pArea->filename );
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;
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 ) )
{
pArea->planet = planet;
LINK( pArea, planet->first_area, planet->last_area, next_on_planet, prev_on_planet);
}
fMatch = TRUE;
}
break;
case 'B':
KEY( "BaseValue", planet->base_value, fread_number( fp ) );
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 ) );
KEY( "Flags", planet->flags, fread_number( 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_number( fp ) );
break;
case 'S':
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( "Taxes", planet->base_value, 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->first_area = NULL;
planet->last_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;
}
void do_setplanet( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
PLANET_DATA *planet;
if ( IS_NPC( ch ) )
{
send_to_pager_color( "Huh?\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if ( arg1[0] == '\0' )
{
send_to_pager_color( "Usage: setplanet <planet> <field> [value]\n\r", ch );
send_to_pager_color( "\n\rField being one of:\n\r", ch );
send_to_pager_color( " base_value flags\n\r", ch );
send_to_pager_color( " name filename starsystem governed_by\n\r", ch );
return;
}
planet = get_planet( arg1 );
if ( !planet )
{
send_to_pager_color( "No such planet.\n\r", ch );
return;
}
if ( !strcmp( arg2, "name" ) )
{
STRFREE( planet->name );
planet->name = STRALLOC( argument );
send_to_pager_color( "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_pager_color( "Done.\n\r", ch );
save_planet( planet );
}
else
send_to_pager_color( "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_pager_color( "Done.\n\r", ch );
}
else
send_to_pager_color( "No such starsystem.\n\r", ch );
save_planet( planet );
return;
}
if ( !strcmp( arg2, "filename" ) )
{
if ( planet->filename )
DISPOSE( planet->filename );
planet->filename = str_dup( argument );
send_to_pager_color( "Done.\n\r", ch );
save_planet( planet );
write_planet_list( );
return;
}
if ( !strcmp( arg2, "base_value" ) )
{
planet->base_value = atoi( argument );
send_to_pager_color( "Done.\n\r", ch );
save_planet( planet );
return;
}
if ( !strcmp( arg2, "flags" ) )
{
char farg[MAX_INPUT_LENGTH];
argument = one_argument( argument, farg);
if ( farg[0] == '\0' )
{
send_to_pager_color( "Possible flags: nocapture\n\r", ch );
return;
}
for ( ; farg[0] != '\0' ; argument = one_argument( argument, farg) )
{
if ( !str_cmp( farg, "nocapture" ) )
TOGGLE_BIT( planet->flags, PLANET_NOCAPTURE );
else
pager_printf_color( ch , "No such flag: %s\n\r" , farg );
}
send_to_pager_color( "Done.\n\r", ch );
save_planet( planet );
return;
}
do_setplanet( ch, "" );
return;
}
void do_showplanet( CHAR_DATA *ch, char *argument )
{
PLANET_DATA *planet;
if ( IS_NPC( ch ) )
{
send_to_pager_color( "Huh?\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_pager_color( "Usage: showplanet <planet>\n\r", ch );
return;
}
planet = get_planet( argument );
if ( !planet )
{
send_to_pager_color( "No such planet.\n\r", ch );
return;
}
pager_printf_color( ch, "%s\n\rFilename: %s\n\r",
planet->name,
planet->filename);
return;
}
void do_makeplanet( CHAR_DATA *ch, char *argument )
{
char filename[256];
PLANET_DATA *planet;
bool found;
if ( !argument || argument[0] == '\0' )
{
send_to_pager_color( "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;
AREA_DATA *area;
set_char_color( AT_WHITE, ch );
for ( planet = first_planet; planet; planet = planet->next )
{
pager_printf_color( ch, "&WPlanet: &G%-15s &WGoverned By: &G%s %s\n\r",
planet->name ,
planet->governed_by ? planet->governed_by->name : "",
IS_SET(planet->flags, PLANET_NOCAPTURE ) ? "(permanent)" : "" );
pager_printf_color( ch, "&WValue: &G%-10ld&W/&G%-10d ",
get_taxes(planet) , planet->base_value);
pager_printf_color( ch, "&WPopulation: &G%-5d &W Pop Support: &G%.1f\n\r",
planet->population , planet->pop_support );
if ( IS_IMMORTAL(ch) )
{
pager_printf_color( ch, "&WAreas: &G");
for ( area = planet->first_area ; area ; area = area->next_on_planet )
pager_printf_color( ch , "%s, ", area->filename );
pager_printf_color( ch, "\n\r" );
}
pager_printf_color( ch, "\n\r" );
count++;
}
if ( !count )
{
set_char_color( AT_BLOOD, ch);
send_to_pager_color( "There are no planets currently formed.\n\r", ch );
}
}
long get_taxes( PLANET_DATA *planet )
{
long gain;
gain = planet->base_value;
gain += planet->base_value*planet->pop_support/100;
gain += UMAX(0, planet->pop_support/10 * planet->population);
return gain;
}