/
olc11/
olc11/Envy20/code/
olc11/install/
olc11/install/area/
olc11/install/changes/
olc11/install/code/
olc11/install/doc/
olc11/install/options/
ILAB OLC Beta 1.1
Jason Dinkel
May. 15 1995

COMM.C

     This file contains modifications needed to stock Envy 1.0 comm.c.
Only the lines commented with /* OLC */ need to be added.  The surrounding
code is for getting ones bearings.

This file contains modifications needed to comm.c.

---- FUNCTION: game_loop_mac_msdos
     DESC: We must assign the three new entries in the descriptor structure
           before the structure is saved in a new variable.

    dcon.pEdit		= NULL;			/* OLC */
    dcon.pString	= NULL;			/* OLC */
    dcon.editor		= 0;			/* OLC */
    dcon.next		= descriptor_list;
    descriptor_list	= &dcon;

     DESC: In the process input loop we must check for what editor a player
           is using.  This code does that.  Make sure you get all of the
           parentheses pasted over the olc section.

	    read_from_buffer( d );
	    if ( d->incomm[0] != '\0' )
	    {
		d->fcommand	= TRUE;
		stop_idling( d->character );

		/* OLC */
		if ( d->showstr_point )
		    show_string( d, d->incomm );
		else
		if ( d->pString )
		    string_add( d->character, d->incomm );
		else
		    if ( d->connected == CON_PLAYING )
		    {
			if ( !run_olc_editor( d ) )
			    interpret( d->character, d->incomm );
		    }
		    else
			nanny( d, d->incomm );
		d->incomm[0]	= '\0';
	    }

---- FUNCTION: game_loop_unix
     DESC: Same as above, but for the unix game loop.

	    read_from_buffer( d );
	    if ( d->incomm[0] != '\0' )
	    {
		d->fcommand	= TRUE;
		stop_idling( d->character );

		/* OLC */
		if ( d->showstr_point )
		    show_string( d, d->incomm );
		else
		if ( d->pString )
		    string_add( d->character, d->incomm );
		else
		    if ( d->connected == CON_PLAYING )
		    {
			if ( !run_olc_editor( d ) )
			    interpret( d->character, d->incomm );
		    }
		    else
			nanny( d, d->incomm );
		d->incomm[0]	= '\0';
	    }

---- FUNCTION: new_descriptor
     DESC: Same as for mac_dos but for unix we use a different function to
           assign the new descriptor structure values.

    dnew->pEdit		= NULL;			/* OLC */
    dnew->pString	= NULL;			/* OLC */
    dnew->editor	= 0;			/* OLC */
    dnew->outsize	= 2000;
    dnew->outbuf	= alloc_mem( dnew->outsize );

---- FUNCTION: process_output
     DESC: This ensures that a player gets the correct prompt based on the
           editor they are using.

    /*
     * Bust a prompt.
     */
    if ( fPrompt && !merc_down && d->connected == CON_PLAYING )	/* OLC */
        if ( d->showstr_point )
	    write_to_buffer( d,
  "[Please type (c)ontinue, (r)efresh, (b)ack, (h)elp, (q)uit, or RETURN]:  ",
			    0 );
	else
	if ( d->pString )
	    write_to_buffer( d, "> ", 2 );
	else
	{
	    CHAR_DATA *ch;

---- FUNCTION: bust_a_prompt
     DESC: These are just nice additions to the prompt so that a builder can
           keep track of what editor they are using and what vnum they are
           editing.  You may want to add them to your help files.

         case 'c' :		/* OLC */
	    i = olc_ed_name( ch );
	    break;
         case 'C' :		/* OLC */
	    i = olc_ed_vnum( ch );
	    break;

---- FUNCTION: check_parse_name
     DESC: Walker found that a player can log in as "none" and change areas.
           This needs to be changed so that this cannot occur.

    if ( is_name( name, "all auto immortal self someone none" ) )
	return FALSE;


---- It will probably be necessary to use Zavod's pager fix.
  I'll include it here for your convenience.  This is the
  version that Mike Nikkel revised and fixed the help messages.

---- FUNCTION: write_to_buffer
     DESC: This function needs one change at the end for the pager to work.
     
replace this:
    strcpy( d->outbuf + d->outtop, txt );
with this:
    strncpy( d->outbuf + d->outtop, txt, length );	/* OLC */


---- FUNCTION: show_string
     DESC: This function replaced the current show_string.

/* OLC, new pager for editing long descriptions. */
/* ========================================================================= */
/* - The heart of the pager.  Thanks to N'Atas-Ha, ThePrincedom for porting  */
/*   this SillyMud code for MERC 2.0 and laying down the groundwork.         */
/* - Thanks to Blackstar, hopper.cs.uiowa.edu 4000 for which the improvements*/
/*   to the pager was modeled from.  - Kahn                                  */
/* - Safer, allows very large pagelen now, and allows to page while switched */
/*   Zavod of jcowan.reslife.okstate.edu 4000.                               */
/* ========================================================================= */

void show_string( DESCRIPTOR_DATA *d, char *input )
{
    char               *start, *end;
    char                arg[MAX_INPUT_LENGTH];
    int                 lines = 0, pagelen;

    /* Set the page length */
    /* ------------------- */

    pagelen = d->original ? d->original->pcdata->pagelen
                          : d->character->pcdata->pagelen;

    /* Check for the command entered */
    /* ----------------------------- */

    one_argument( input, arg );

    switch( UPPER( *arg ) )
    {
        /* Show the next page */

        case '\0':
        case 'C': lines = 0;
                  break;
        
        /* Scroll back a page */

        case 'B': lines = -2 * pagelen;
                  break;

        /* Help for show page */

        case 'H': write_to_buffer( d, "B     - Scroll back one page.\n\r", 0 );
                  write_to_buffer( d, "C     - Continue scrolling.\n\r", 0 );
                  write_to_buffer( d, "H     - This help menu.\n\r", 0 );
                  write_to_buffer( d, "R     - Refresh the current page.\n\r",
                                   0 );
                  write_to_buffer( d, "Enter - Continue Scrolling.\n\r", 0 );
                  return;

        /* refresh the current page */

        case 'R': lines = -1 - pagelen;
                  break;

        /* stop viewing */

        default:  free_string( d->showstr_head );
                  d->showstr_head  = NULL;
                  d->showstr_point = NULL;
                  return;
    }

    /* do any backing up necessary to find the starting point */
    /* ------------------------------------------------------ */

    if ( lines < 0 )
    {
        for( start= d->showstr_point; start > d->showstr_head && lines < 0;
             start-- )
            if ( *start == '\r' )
                lines++;
    }
    else
        start = d->showstr_point;

    /* Find the ending point based on the page length */
    /* ---------------------------------------------- */

    lines  = 0;

    for ( end= start; *end && lines < pagelen; end++ )
        if ( *end == '\r' )
            lines++;

    d->showstr_point = end;

    if ( end - start )
        write_to_buffer( d, start, end - start );

    /* See if this is the end (or near the end) of the string */
    /* ------------------------------------------------------ */

    for ( ; isspace( *end ); end++ );

    if ( !*end )
    {
        free_string( d->showstr_head );
        d->showstr_head  = NULL;
        d->showstr_point = NULL;
    }

    return;
}

END OF FILE COMM.C