#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; }