lance/data/socials/
/*
 *  Clan loader and clan functions 
 *  Justin Guerber, 2000
 */

#if defined(macintosh)
#include <types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
#include "interp.h"
#include "recycle.h"
#include "tables.h"
#include "lookup.h"
#include "olc.h"


/*
 * Function to announce to clan certain happenings.
 */

void clan_announce( int clan, char *argument, CHAR_DATA *victim, CHAR_DATA *ch )
{
    DESCRIPTOR_DATA *d;
    
    for( d = descriptor_list; d; d = d->next )
    {
    CHAR_DATA *wch;
    	if( d->connected != CON_PLAYING )
    		return;
   	
   	wch = ( d->original != NULL ) ? d->original : d->character;
   	
    	if( wch != ch &&
	    wch != victim &&
   	    wch->clan == clan )
    	{
    			send_to_char( argument, wch );
	}
    }
    return;
}    		



/*
 * Sets the subclan
 *   Not very efficient
 */
 

void set_subclan( CHAR_DATA *ch )
{
/*
    if( ch->clan == 2 )
    {
    	if( ch->class == 2 || ch->class == 3 || ch->class == 4 || ch->class == 5 )
    		ch->subclan = 4;
    	else if( ch->class == 1 || ch->class == 6 )
    		ch->subclan = 5;
    	else if( ch->class == 0 || ch->class == 7 )
    		ch->subclan = 6;
    }
*/
    if( ch->clan == 3 )
    {
	if( ch->alignment >= 333 )
		ch->subclan = 7;
	else if( ch->alignment >= -333 )
		ch->subclan = 8;
	else
		ch->subclan = 9;
    }
    
    if( ch->clan == 4 )
    {
    	if( ch->alignment >= 333 )
    		ch->subclan = 10;
    	else if( ch->alignment >=-333 )
    		ch->subclan = 11;
    	else
    		ch->subclan = 12;
    }
    
    return;
}
    

/*
 * Subfunction for petition
 *    Lists people petitioning your clan  
 */
                        
void do_petition_list(int clan, CHAR_DATA *ch)
{
    char buf[MAX_STRING_LENGTH];
    DESCRIPTOR_DATA *d;
    bool found=FALSE;
           
    for (d = descriptor_list; d; d = d->next)
    {
        CHAR_DATA *victim;
        victim = d->original ? d->original : d->character;
        if (d->connected == CON_PLAYING)
		if( victim->petition == clan )
		{
                	sprintf( buf, "{c--> {x%s%s\n\r",
                	        victim->name,
                	        victim->pcdata->title );
                	send_to_char( buf, ch );
                	
                	found = TRUE;
		}
    }
         
    if( !found )
        send_to_char( "{cNone.{x\n\r", ch );
}




/*
 * petition
 * petition <clan>
 * petition retract
 */

void do_petition( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_STRING_LENGTH];
    char arg2[MAX_STRING_LENGTH];
    char buf[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];

    int clan;
    
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );


    if(ch->clan == clan_lookup("loner") || !ch->clan
    || ch->clan == clan_lookup("renegade")
    || ch->clan == clan_lookup("heathen") ) {

    if( arg1[0] == '\0' )
    {
    	send_to_char( "Syntax: petition <clan>.\n\r", ch );
    	send_to_char( "Syntax: petition retract.\n\r", ch );
    	return;
    }

    if( !str_prefix(arg1, "retract") )
    {
         send_to_char("You withdraw your petition.\n\r", ch);
         
         sprintf( buf1, "%s withdraws their petition.\n\r", ch->name );
         clan_announce( ch->petition, buf1, ch, ch ); 
         
	 ch->petition = 0;
         return;
         
    }
    
    if ((clan = clan_lookup(arg1)) == 0)
    {
    	send_to_char("Clan does not exist.\n\r", ch);
    	return;
    }

    if( ch->petition )
    {
    	send_to_char( "You have already petitioned a clan. Try retracting that one first.\n\r", ch);
    	return;
    }


    sprintf( buf, "You have petitioned %s for membership.\n\r",
    	capitalize( clan_table[clan].name ) );
    send_to_char( buf, ch );

    ch->petition = clan;

    sprintf( buf1, "%s has petitioned for acceptance.\n\r", ch->name );
    clan_announce( ch->petition, buf1, ch, ch );

    return;    

    }

        
    if( ch->clanlevel <= 6 )
    {
    	send_to_char( "You can't petition while in a clan.\n\r", ch );
    	return;
    }

    if( ch->clanlevel >= 7 )
    {
    	if( arg1[0] == '\0' )
    	{
    		send_to_char( "{yThe following people have petitioned your clan:{x\n\r", ch );
		do_petition_list( ch->clan, ch );
    		return;
    	}
    }
	
    return;
}



/*
 * clancmd promote <player>
 * clancmd demote <player>
 * clancmd induct <player>
 * clancmd discharge <player>
 * clancmd subclan <player> <subclan>
 */

void do_clancmd( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_STRING_LENGTH];
    char arg2[MAX_STRING_LENGTH];
    char arg3[MAX_STRING_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    
    
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    argument = one_argument( argument, arg3 );


    if( !ch->clan || ch->clanlevel <= 6 )
    {
    	send_to_char( "Huh?\n\r", ch );
    	return;
    }
    
    if( arg1[0] == '\0'  )
    {
    	send_to_char( "Syntax:\n\r", ch );
    	send_to_char( "        clancmd induct <player> [subclan].\n\r", ch );
	send_to_char( "        clancmd promote <player>.\n\r", ch );
    	send_to_char( "        clancmd demote <player>.\n\r", ch );
    if( ch->clanlevel >= 10 )
    {
    	send_to_char( "        clancmd discharge <player>.\n\r", ch );
    	send_to_char( "        clancmd subclan <player> <subclan>.\n\r", ch );
    }
        return;
    }
    
    if( (victim = get_char_room( ch, arg2 )) == NULL )
    {
    	send_to_char( "They're not here.\n\r", ch );
    	return;
    }
    
    
    if( !str_prefix( arg1, "induct" ) )
    {
    	if( victim->petition != ch->clan )
    	{
    		send_to_char( "They haven't petitioned your clan. Type petition.\n\r", ch );
    		return;
    	}


    	victim->clan = ch->clan;
    	victim->clanlevel = 1;
    	
    	if( victim->clan == 1 )
    		victim->subclan = 1;

	if(arg3[0] == '\0')
    	    set_subclan( victim );
    	else
    	{
    	    int subclan = subclan_lookup( arg3 );
    	    if(subclan_table[subclan].clan == victim->clan)
    	    {
    	        victim->subclan = subclan;
    	    }
    	    else
    	    {
    	        send_to_char("That subclan is not part of your clan.\n\r", ch);
    	        send_to_char("Default subclan will be set.\n\r", ch);
    	        set_subclan(victim);
    	    }
    	}
    	victim->petition = 0;
    	

    	sprintf( buf1, "You have admitted %s into the clan.\n\r", victim->name );
    	send_to_char( buf1, ch );
    	
    	sprintf( buf1, "%s has admitted you into %s.\n\r",
    		ch->name,
    		capitalize( clan_table[ch->clan].name ) );
    	send_to_char( buf1, victim );
    	
    	sprintf( buf1, "%s has admitted %s into the clan.\n\r", ch->name, victim->name );
    	clan_announce( ch->clan, buf1, victim, ch );
    	
    	return;
    }
    
    if( victim->clan != ch->clan )
    {
    	send_to_char( "They're not in your clan.\n\r", ch );
    	return;
    }

    if( !str_prefix( arg1, "promote" ) )
    {
	if( (ch->level <= 101) && (victim->clanlevel >= 9) )
	{
		send_to_char( "Only gods can make leaders.\n\r", ch );
		return;
	}

    	if( victim->clanlevel >= ch->clanlevel )
    	{
    		send_to_char( "You can't promote someone who outranks you.\n\r", ch );
    		return;
    	}


    	victim->clanlevel++;

    	
    	sprintf( buf1, "You have promoted %s to %s!\n\r",
    		victim->name, clanrank_name(victim) );
    	send_to_char( buf1, ch );
    	
    	sprintf( buf1, "%s has promoted you to %s!\n\r",
    		ch->name, clanrank_name(victim) );
    	send_to_char( buf1, victim );
    	
    	
    	sprintf( buf1, "%s has promoted %s to %s!\n\r",
    		ch->name, victim->name, clanrank_name(victim) );
    	clan_announce( ch->clan, buf1, victim, ch );
    	
    	return;
    }
    else if( !str_prefix( arg1, "demote" ) )
    {
	if( victim->clanlevel == 1 )
	{
		send_to_char( "They're as low as they can go.\n\r", ch );
		return;
	}

	if( (ch->level <= 101) && (victim->clanlevel >= 10) )
	{
		send_to_char( "Only gods can demote a leader.\n\r", ch );
		return;
	}

    	if( victim->clanlevel >= ch->clanlevel )
        {
        	send_to_char( "You can't demote someone who outranks you.\n\r", ch );
		return;
	}


    	victim->clanlevel--;
    	
	
	sprintf( buf1, "You have demoted %s to %s!\n\r",
		victim->name, clanrank_name(victim) );
	send_to_char( buf1, ch );
	
	sprintf( buf1, "%s has demoted you to %s!\n\r",
		ch->name, clanrank_name(victim) );
	send_to_char( buf1, victim );    	


    	sprintf( buf1, "%s has demoted %s to %s!\n\r",
    		ch->name, victim->name, clanrank_name(victim) );
    	clan_announce( ch->clan, buf1, victim, ch );
    	
    	return;
    }


    if( ch->clanlevel >= 10 ) {
    if( !str_prefix( arg1, "discharge" ) )
    {
	if( victim->clanlevel >= ch->clanlevel )
    	{
        	send_to_char( "You can't discharge someone who outranks you.\n\r", ch );
        	return;
    	}


	sprintf( buf1, "You have discharged %s from the clan!\n\r",
		victim->name );
	send_to_char( buf1, ch );
	
	sprintf( buf1, "%s has discharged you from the clan!\n\r",
		ch->name );
	send_to_char( buf1, victim );


    	sprintf( buf1, "%s has discharged %s from the clan!\n\r",
    		ch->name, victim->name );
    	clan_announce( ch->clan, buf1, victim, ch );


    	victim->clanlevel = 0;
    	victim->clan = 0;
	victim->subclan = 0;
	
	return;
    }
    else if( !str_prefix( arg1, "subclan" ) )
    {
    	int subclan;
    	
    	if(victim->clanlevel >= ch->clanlevel)
    	{
    	    send_to_char("You really can't do that.\n\r", ch);
    	    return;
    	}
    
    	if( arg3[0] == '\0' )
    	{
    		send_to_char( "Please enter a subclan.\n\r", ch );
    		return;
    	}
    	
    	subclan = subclan_lookup( arg3 );
    	
    	if( subclan_table[subclan].clan != ch->clan )
    	{
    		send_to_char( "That subclan is not a part of your clan.\n\r", ch);
    		return;
    	}
    	
    	
    	sprintf( buf1, "You have changed %s's subclan to %s.\n\r",
    		victim->name, capitalize(subclan_table[subclan].name) );
    	send_to_char( buf1, ch );
    	
    	sprintf( buf1, "%s has changed your subclan to %s.\n\r",
    		ch->name, capitalize(subclan_table[subclan].name) );
    	send_to_char( buf1, victim);
    	
    	
    	sprintf( buf1, "%s has changed %s's subclan to %s.\n\r",
    		ch->name, victim->name, capitalize( subclan_table[subclan].name) );
    	clan_announce( ch->clan, buf1, victim, ch );
    	
    	victim->subclan = subclan;
    	
    	return;
    }
    }


    	send_to_char( "Syntax:\n\r", ch );
    	send_to_char( "        clancmd induct <player>.\n\r", ch );
	send_to_char( "        clancmd promote <player>.\n\r", ch );
    	send_to_char( "        clancmd demote <player>.\n\r", ch );
    if( ch->clanlevel >= 10 )
    {
    	send_to_char( "        clancmd discharge <player>.\n\r", ch );
    	send_to_char( "        clancmd subclan <player> <subclan>.\n\r", ch );
    }

}