/*
  #define IS_LEADER(ch)      (!IS_NPC(ch)                   \
                && (ch)->pcdata->clan              \
                && ((ch)->name==ch->pcdata->clan->leader))

  Define this in mud.h, its much easier than doing the check repeatedly.

*/



/*
   This is the color stripping function by gavin. Its only needed if you want
   to prevent morts using color codes in setrank'd stuff.
 */
/* - Gavin - ur_gavin@hotmail.com
 * - Unknown Regions - http://ur.lynker.com 
 */
char *stripclr( char *text )
{
	int i = 0, j = 0;

	if (!text || text[0] == '\0')
	{
		return "";
	}
	else
	{
		char *buf;
		static char done[MAX_INPUT_LENGTH*2];

		done[0] = '\0';

		if ( (buf = (char *)malloc( strlen(text) * sizeof(text) )) == NULL)
			return text;      

		/* Loop through until you've hit your terminating 0 */
		while (text[i] != '\0')
		{
			while (text[i] == '&')
			{
				i += 2;
			}
			if ( text[i] != '\0' )
			{
				if ( isspace(text[i]) )
				{
					buf[j] = ' ';
					i++;
					j++;
				}
				else
				{
					buf[j] = text[i];
					i++;
					j++;
				}
			}
			else
				buf[j] = '\0';
		}

		buf[j] = '\0';

		sprintf(done, "%s", buf);
		buf = realloc(buf, j*sizeof(char));
		free( buf);

		return done;
	}
}



/* 
   Function to remove a chunk from a string and keep the string intact 
   Comes in handy to have.
*/

char *strip_from_string( char *string, char *word )
{
    char buf[MAX_INPUT_LENGTH];
    char buf2[MAX_INPUT_LENGTH];
    static char newstring[MAX_INPUT_LENGTH];


        newstring[0] = '\0';
	while ( string[0] != '\0' )
	{
	   string = one_argument( string, buf );
	   if (str_cmp( word, buf))
           {
            sprintf(buf2, "%s ", buf);
            strcat( newstring, buf2);
           }
 
        }      
    return newstring;
}



/* Cheap hack of bestow to allow leaders to give certain abilities to whomever they want */
void do_empower ( CHAR_DATA *ch , char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    CLAN_DATA *clan;
    char buf[MAX_STRING_LENGTH];

    if ( IS_NPC( ch ) || !ch->pcdata->clan )
    {
	send_to_char( "Huh?\n\r", ch );
	return;
    }

    clan = ch->pcdata->clan;

    if ( (ch->pcdata && ch->pcdata->bestowments
    &&    is_name("empower", ch->pcdata->bestowments))
    || IS_LEADER(ch) )
	;
    else
    {
	send_to_char( "You clan hasn't seen fit to bestow that ability to you!\n\r", ch );
	return;
    }

    sprintf( buf, "%s: empower %s", ch->name, argument);
    log_string( buf );
    argument = one_argument( argument, arg );
    argument = one_argument( argument, arg2 );

    if ( arg[0] == '\0' )
    {
	send_to_char( "Empower whom to do what?\n\r", ch );
	return;
    }

    if ( ( victim = get_char_room( ch, arg ) ) == NULL )
    {
	send_to_char( "That player is not here.\n\r", ch);
	return;
    }

    if ( IS_NPC(victim) )
    {
	send_to_char( "Not on NPC's.\n\r", ch );
	return;
    }

    if ( victim == ch )
    {
	    send_to_char( "Nice try.\n\r", ch );
	    return;
    }
 
    if ( victim->pcdata->clan != ch->pcdata->clan )
    {
	    send_to_char( "This player does not belong to your clan!\n\r", ch );
	    return;
    }

    if (!victim->pcdata->bestowments)
      victim->pcdata->bestowments = str_dup("");

    if ( !str_cmp( arg2, "list" ) )
    {
        ch_printf( ch, "Current bestowed commands on %s: %s.\n\r",
                      victim->name, victim->pcdata->bestowments );
        return;
    }

    if (is_name(arg2, ch->pcdata->bestowments))
    {
        ch_printf( ch, "%s already is empowered with %s, removing.\n\r", victim->name, arg2 );
        sprintf( buf, "%s", strip_from_string(victim->pcdata->bestowments, arg2) );
        DISPOSE( victim->pcdata->bestowments );
        victim->pcdata->bestowments = str_dup( buf );
        ch_printf( ch, "Current empowerment now: %s.\n\r", victim->pcdata->bestowments );
        return;
    }

    if ( !str_cmp( arg2, "none" ) )
    {
        DISPOSE( victim->pcdata->bestowments );
	victim->pcdata->bestowments = str_dup("");
        ch_printf( ch, "Bestowments removed from %s.\n\r", victim->name );
        ch_printf( victim, "%s has removed your bestowed clan abilities.\n\r", ch->name );
        return;
    }
    else if ( !str_cmp( arg2, "induct" ) )
    {
      sprintf( buf, "%s %s", victim->pcdata->bestowments, arg2 );
      DISPOSE( victim->pcdata->bestowments );
      victim->pcdata->bestowments = str_dup( buf );
      ch_printf( victim, "%s has given you permission to induct new members.\n\r", 
             ch->name );
      send_to_char( "Ok, they now have the ablitity to induct new members.\n\r", ch );
    }
    else if ( !str_cmp( arg2, "outcast" ) )
    {
      sprintf( buf, "%s %s", victim->pcdata->bestowments, arg2 );
      DISPOSE( victim->pcdata->bestowments );
      victim->pcdata->bestowments = str_dup( buf );
      ch_printf( victim, "%s has given you permission to outcast members.\n\r", 
             ch->name );
      send_to_char( "Ok, they now have the ablitity to outcast members.\n\r", ch );
    }
    else if ( !str_cmp( arg2, "empower" ) )
    {
      sprintf( buf, "%s %s", victim->pcdata->bestowments, arg2 );
      DISPOSE( victim->pcdata->bestowments );
      victim->pcdata->bestowments = str_dup( buf );
      ch_printf( victim, "%s has given you the ability to empower others.\n\r", 
             ch->name );
      send_to_char( "Ok, they now have the ablitity to empower others.\n\r", ch );
    }
    else if ( !str_cmp( arg2, "setrank" ) )
    {
      sprintf( buf, "%s %s", victim->pcdata->bestowments, arg2 );
      DISPOSE( victim->pcdata->bestowments );
      victim->pcdata->bestowments = str_dup( buf );
      ch_printf( victim, "%s has given you the setrank command.\n\r", 
             ch->name );
      send_to_char( "Ok, they now have the setrank command.\n\r", ch );
    }
    else
    {
      send_to_char( "Currently you may empower members with only the following:\n\r", ch ); 
      send_to_char(     "induct:       ability to induct new members.\n\r", ch );    
      send_to_char(     "outcast:      ability to outcast members.\n\r", ch );    
      send_to_char(     "setrank:      ability to set rank information as a leader (use with caution).\n\r", ch );    
      send_to_char(     "empower:      ability to empower other members (use with caution).\n\r", ch );    
      send_to_char(     "none:         removes bestowed abilities.\n\r", ch );    
      send_to_char(     "list:         shows bestowed abilities.\n\r", ch );    
    }
    
    save_char_obj( victim );	/* clan gets saved when pfile is saved */
    return;


}
/* Cheap hack of setclan allowing leaders to set info themselves */

void do_setrank( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    CLAN_DATA *clan;

    set_char_color( AT_PLAIN, ch );
    if ( IS_NPC( ch ) )
    {
	send_to_char( "Huh?\n\r", ch );
	return;
    }

    if ( (ch->pcdata && ch->pcdata->bestowments
    &&    is_name("setrank", ch->pcdata->bestowments))
    ||   IS_LEADER(ch) );
    else
    {
	send_to_char( "Huh?\n\r", ch );
	return;
    }

    switch( ch->substate )
    {
        default:
		break;
 
	case SUB_RESTRICTED:
		send_to_char( "You cannot do this while in another command.\n\r", ch );
		return;

	case SUB_HELP_EDIT:  
		clan = ch->dest_buf;
        	STRFREE( clan->description );
        	clan->description = copy_buffer( ch );
        	stop_editing( ch );
		save_clan( clan );
      		ch->substate = ch->tempnum;
        	return;
    }
    sprintf( buf, "%s: setrank %s", ch->name, argument);

    argument = one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
	send_to_char( "Usage: setrank <clan> <field> <player>\n\r", ch );
	send_to_char( "\n\rField being one of:\n\r", ch );
	send_to_char( " number1 number2 number3\n\r", ch ); 
	send_to_char( " leadrank onerank tworank threerank\n\r", ch );
	send_to_char( " url motto desc\n\r", ch );
	return;
    }

    clan = get_clan( ch->pcdata->clan_name );
    if ( !clan )
    {
	send_to_char( "No such clan.\n\r", ch );
	return;
    }
    log_string( buf );
    if ( !str_cmp( arg, "motto" ) )
    {
	STRFREE( clan->motto );
	clan->motto = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    if ( !str_cmp( arg, "leadrank" ) )
    {
	STRFREE( clan->leadrank );
	clan->leadrank = STRALLOC( stripclr(argument)  );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    if ( !str_cmp( arg, "onerank" ) )
    {
	STRFREE( clan->onerank );
	clan->onerank = STRALLOC( stripclr(argument) );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    if ( !str_cmp( arg, "tworank" ) )
    {
	STRFREE( clan->tworank );
	clan->tworank = STRALLOC( stripclr(argument) );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    if ( !str_cmp( arg, "threerank" ) )
    {
	STRFREE( clan->threerank );
	clan->threerank = STRALLOC( stripclr(argument) );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    if ( !str_cmp( arg, "number1" ) )
    {
	STRFREE( clan->number1 );
	clan->number1 = STRALLOC( capitalize(argument) );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    if ( !str_cmp( arg, "number2" ) )
    {
	STRFREE( clan->number2 );
	clan->number2 = STRALLOC( capitalize(argument) );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    if ( !str_cmp( arg, "number3" ) )
    {
	STRFREE( clan->number3 );
	clan->number3 = STRALLOC( capitalize(argument) );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    if ( !str_cmp( arg, "desc" ) )
    {
	if ( ch->substate == SUB_REPEATCMD )
	  ch->tempnum = SUB_REPEATCMD;
	else
          ch->tempnum = SUB_NONE;
        ch->substate = SUB_HELP_EDIT;
        ch->dest_buf = clan;
        start_editing( ch, clan->description );
        return;
    }
    if ( !str_cmp( arg, "url" ) )
    {
	STRFREE( clan->url );
	clan->url = STRALLOC( argument );
	send_to_char( "Done.\n\r", ch );
	save_clan( clan );
	return;
    }
    do_setrank( ch, "" );
    return;
}

