/**************************************************************************** * |Dragon Ball Z Universe, Version FINAL | * * -----------------------------------------------------------| * * |DBZUCodebase V. FINAL, 2005, 2006, 2007, Jessie Reidl | * * -----------------------------------------------------------| * ****************************************************************************/ #include <sys/types.h> #include <stdio.h> #include <string.h> #include <time.h> #include "mud.h" DOCK_DATA *first_dock; DOCK_DATA *last_dock; #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } DOCK_DATA *get_dock( char *name ) { DOCK_DATA *dock; if ( name[0] == '\0' ) return NULL; if ( name == NULL ) return NULL; for ( dock = first_dock; dock; dock = dock->next ) if ( !str_cmp( name, dock->coordname ) ) return dock; return NULL; } bool get_dockcoord( short x, short y, short z, short d ) { DOCK_DATA *dock; for ( dock = first_dock; dock; dock = dock->next ) { if ( !dock->coordname || dock->coordname[0] == '\0') continue; if ( dock->x == x && dock->y == y && dock->z == z && dock->d == d ) return TRUE; } return FALSE; } char *get_dockname( short x, short y, short z, short d ) { DOCK_DATA *dock; for ( dock = first_dock; dock; dock = dock->next ) { if ( !dock->coordname || dock->coordname[0] == '\0') continue; if ( dock->x == x && dock->y == y && dock->z == z && dock->d == d ) return dock->coordname; } return "unknown"; } void save_docks( void ) { DOCK_DATA *dock; FILE *fp; if ( (fp=fopen( DOCK_FILE, "w" )) == NULL ) { bug( "Cannot open docks.dat for writting", 0 ); perror( DOCK_FILE ); return; } for ( dock = first_dock; dock; dock = dock->next ) { if ( !dock->name || dock->name[0] == '\0') continue; fprintf( fp, "#DOCK\n" ); fprintf( fp, "Name %s~\n", dock->name ); fprintf( fp, "Coordname %s~\n", dock->coordname ); fprintf( fp, "X %d\n", dock->x ); fprintf( fp, "Y %d\n", dock->y ); fprintf( fp, "Z %d\n", dock->z ); fprintf( fp, "D %d\n", dock->d ); fprintf( fp, "Room %d\n", dock->room ); fprintf( fp, "Onlyshuttle %d\n", dock->onlyshuttle ); fprintf( fp, "Type %d\n", dock->type ); fprintf( fp, "End\n\n" ); } fprintf( fp, "#END\n" ); fclose( fp ); } void fread_dock( DOCK_DATA *dock, FILE * fp ) { const 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 'N': KEY( "Name", dock->name, fread_string( fp ) ); break; case 'C': KEY( "Coordname", dock->coordname, fread_string( fp ) ); break; case 'E': if( !str_cmp( word, "End" ) ) { return; } break; case 'O': KEY( "Onlyshuttle", dock->onlyshuttle, fread_number( fp ) ); break; case 'R': KEY( "Room", dock->room, fread_number( fp ) ); break; case 'T': KEY( "Type", dock->type, fread_number( fp ) ); break; case 'X': KEY( "X", dock->x, fread_number( fp ) ); break; case 'Y': KEY( "Y", dock->y, fread_number( fp ) ); break; case 'Z': KEY( "Z", dock->z, fread_number( fp ) ); break; case 'D': KEY( "D", dock->d, fread_number( fp ) ); break; } if( !fMatch ) bug( "Fread_dock: no match: %s", word ); } } void load_docks( void ) { char filename[256]; DOCK_DATA *dock; FILE *fp; first_dock = NULL; last_dock = NULL; snprintf( filename, 256, "%s", DOCK_FILE ); if( ( fp = fopen( filename, "r" ) ) != NULL ) { for( ;; ) { char letter; char *word; letter = fread_letter( fp ); if( letter == '*' ) { fread_to_eol( fp ); continue; } if( letter != '#' ) { bug( "%s", "Load_dock: # not found." ); break; } word = fread_word( fp ); if( !str_cmp( word, "DOCK" ) ) { CREATE( dock, DOCK_DATA, 1 ); fread_dock( dock, fp ); LINK( dock, first_dock, last_dock, next, prev ); continue; } else if( !str_cmp( word, "END" ) ) break; else { bug( "Load_dock: bad section: %s.", word ); continue; } } fclose( fp ); fp = NULL; } return; } void do_dockstat( CHAR_DATA * ch, char *argument ) { DOCK_DATA *dock; if( !first_dock ) { send_to_char( "No docks defined.\n\r", ch ); return; } if ( argument[0] == '\0' ) { send_to_char( "Dockstat which dock?.\n\r", ch ); return; } if ( (dock = get_dock( argument )) == NULL ) { send_to_char( "This dock doesn't exist.\n\r", ch); return; } send_to_char( "\n\r&z+---------------------------------------------------+", ch); send_to_char( "\n\r&z| &RDock Stats &z |", ch); send_to_char( "\n\r&z+---------------------------------------------------+\n\r", ch); ch_printf( ch,"\n\r&YName: &W%s", dock->name ); ch_printf( ch,"\n\r&YCName: &W%s", dock->coordname ); ch_printf( ch,"\n\r&YRoom: &W%d", dock->room ); ch_printf( ch,"\n\r&YCoords: &W%d&z.&W%d&z.&W%d&z.&W%d", dock->x, dock->y, dock->z, dock->d ); ch_printf( ch,"\n\r&YPrivate: &W%s\n\r", dock->onlyshuttle == TRUE ? "Yes" : "No" ); send_to_char( "\n\r&z+---------------------------------------------------+", ch); return; } void do_setdock( CHAR_DATA * ch, char *argument ) { DOCK_DATA *dock = NULL; char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH]; if( IS_NPC( ch ) ) { send_to_char( "Sorry, NPCs can't edit docks.\n\r", ch ); return; } if( !ch->desc ) { send_to_char( "You have no descriptor.\n\r", ch ); return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if( arg1[0] == '\0' || !str_cmp( arg1, "help" ) ) { send_to_char( "\n\rUsage: setdock <coordname> <field> <value>\n\r", ch ); send_to_char( " setdock <coordname> create\n\r", ch ); send_to_char( " setdock <coordname> delete\n\r", ch ); send_to_char( " setdock <coordname> private\n\r", ch ); send_to_char( " setdock save\n\r", ch ); send_to_char( "Field being one of:\n\r", ch ); send_to_char( " name, x, y, z, d, coordname, room, type\n\r", ch ); return; } if ( !str_cmp( arg1, "save" ) ) { save_docks(); send_to_char( "Docks saved.\n\r", ch ); return; } dock = get_dock( arg1 ); if ( !str_cmp( arg2, "create" ) ) { if ( dock ) { send_to_char("This dock already exists.\n\r", ch ); return; } CREATE( dock, DOCK_DATA, 1 ); LINK( dock, first_dock, last_dock, next, prev ); dock->coordname = STRALLOC( arg1 ); dock->name = STRALLOC( arg1 ); dock->x = dock->y = dock->z = dock->d = dock->room = -1; dock->onlyshuttle = FALSE; send_to_char( "Dock added.\n\r", ch ); return; } if ( !dock ) { send_to_char("This dock doesnt exist.\n\r", ch ); return; } if ( !str_cmp( arg2, "delete" ) ) { STRFREE( dock->name ); STRFREE( dock->coordname ); UNLINK( dock, first_dock, last_dock, next, prev ); DISPOSE( dock ); send_to_char( "Dock deleted.\n\r", ch); } if ( !str_cmp( arg2, "private" ) ) { if ( dock->onlyshuttle == TRUE ) { send_to_char( "This dock is now available for all ships.\n\r", ch); dock->onlyshuttle = FALSE; } else { send_to_char( "This dock is now only available for shuttles only.\n\r", ch); dock->onlyshuttle = TRUE; } return; } if ( argument[0] == '\0' ) { do_setdock( ch, "" ); return; } if ( !str_cmp( arg2, "name" ) ) { STRFREE( dock->name ); dock->name = STRALLOC( argument ); ch_printf( ch, "Changing Dock's name to: %s", dock->name ); return; } if ( !str_cmp( arg2, "coordname" ) ) { STRFREE( dock->coordname ); dock->coordname = STRALLOC( argument ); ch_printf( ch, "Changing Dock's coordname to: %s", dock->coordname ); return; } if ( !is_number(argument)) { send_to_char("Value must be a number.\n\r", ch); return; } if ( !str_cmp( arg2, "x" ) ) { dock->x = atoi(argument); ch_printf( ch, "Setting Dock's X Coordinate to: %d\n\r", dock->x ); return; } if ( !str_cmp( arg2, "y" ) ) { dock->y = atoi(argument); ch_printf( ch, "Setting Dock's Y Coordinate to: %d\n\r", dock->y ); return; } if ( !str_cmp( arg2, "z" ) ) { dock->z = atoi(argument); ch_printf( ch, "Setting Dock's Z Coordinate to: %d\n\r", dock->z ); return; } if ( !str_cmp( arg2, "d" ) ) { dock->d = atoi(argument); ch_printf( ch, "Setting Dock's D Coordinate to: %d\n\r", dock->d ); return; } if ( !str_cmp( arg2, "room" ) ) { dock->room = atoi(argument); ch_printf( ch, "Setting Dock's Room Coordinate to: %d\n\r", dock->room ); return; } if ( !str_cmp( arg2, "type" ) ) { dock->type = atoi( argument); ch_printf( ch, "Setting Dock's Type to: %d\n\r", dock->type ); ch_printf( ch, "1 - Spaceport\n\r2 - Planet\n\r3 - HQ\n\r4 - Other\n\r", ch); return; } do_setdock( ch, "" ); return; } void do_coordinates( CHAR_DATA *ch, char *argument ) { sh_int x; bool first; DOCK_DATA *dock; if( !first_dock ) { send_to_char( "No docks defined.\n\r", ch ); return; } send_to_pager( "\n\r&z+----------------------------+------------------+----------------------+\n\r", ch ); send_to_pager( "&z| &RLocation&z |&G X Y Z D&z |&R Coord Name&z |\n\r", ch ); send_to_pager( "&z+----------------------------+------------------+----------------------+\n\r", ch ); for ( x = 0; x <= DOCK_OTHER; x++ ) { first = FALSE; for( dock = first_dock; dock; dock = dock->next ) { if ( dock->onlyshuttle == TRUE ) continue; if ( x == DOCK_SPACEPORT && first == FALSE ) ch_printf( ch, "&z|&YSpaceport Docks&O: &z| | |\n\r",ch); if ( x == DOCK_PLANET && first == FALSE ) ch_printf( ch, "&z|&YPlanet Docks&O: &z| | |\n\r", ch); if ( x == DOCK_HQ && first == FALSE ) ch_printf( ch, "&z|&YHead Quarter Docks&O: &z| | |\n\r", ch); if ( x == DOCK_OTHER && first == FALSE ) ch_printf( ch, "&z|&YOther Docks&O: &z| | |\n\r", ch); first = TRUE; if ( x == dock->type ) ch_printf( ch, "&z|&W %-25s &z| &W%3d %3d %3d %3d &z| &W%-20s &z|\n\r", dock->name, dock->x, dock->y, dock->z, dock->d, dock->coordname ); if ( dock == last_dock ) break; } } send_to_pager( "&z+----------------------------+------------------+----------------------+\n\r", ch ); return; } void do_docks( CHAR_DATA *ch, char *argument ) { sh_int x; bool first; DOCK_DATA *dock; if( !first_dock ) { send_to_char( "No docks defined.\n\r", ch ); return; } send_to_pager( "\n\r&z+----------------------------+------------------+----------------------+------------+\n\r", ch ); send_to_pager( "&z| &RLocation&z |&G X Y Z D&z |&R Coord Name&z | &WRoom&z |\n\r", ch ); send_to_pager( "&z+----------------------------+------------------+----------------------+------------+\n\r", ch ); for ( x = 0; x <= DOCK_OTHER; x++ ) { first = FALSE; for( dock = first_dock; dock; dock = dock->next ) { if ( x == DOCK_SPACEPORT && first == FALSE ) ch_printf( ch, "&z|&YSpaceport Docks&O: &z| | | |\n\r", ch); if ( x == DOCK_PLANET && first == FALSE ) ch_printf( ch, "&z|&YPlanet Docks&O: &z| | | |\n\r", ch); if ( x == DOCK_HQ && first == FALSE ) ch_printf( ch, "&z|&YHead Quarter Docks&O: &z| | | |\n\r", ch); if ( x == DOCK_OTHER && first == FALSE ) ch_printf( ch, "&z|&YOther Docks&O: &z| | | |\n\r", ch); first = TRUE; if ( x == dock->type ) ch_printf( ch, "&z|&W %-25s &z| &W%3d %3d %3d %3d &z| &W%-20s &z| &W%6d&z |\n\r", dock->name, dock->x, dock->y, dock->z, dock->d, dock->coordname, dock->room ); if ( dock == last_dock ) break; } } send_to_pager( "&z+----------------------------+------------------+----------------------+------------+\n\r", ch ); return; }