FORMCLAN
----------------------------------------------------------------------
This snippet was coded by Rojan for Legends of the Jedi.
http://www.legendsofthejedi.com/
legendsofthejedi.com:5656

It has been released with some modifications to allow it to compile and run on SWR FUSS 1.2.

You are free to distribute/modify/post this snippet as you see fit, as long as you leave the credits and file comments (including these) intact.

This snippet allows players to create a clan on their own by providing a certain amount of money/credits and a sufficient member list.
It also provides the possibility of a clan dissolving if it falls below a minimum limit of members or funds. Clans can be set with the nodissolve flag to avoid this.
This snippet also redefines all of the clan types, for more variety.
It also does away with subclans.

Enjoy! - Rojan
----------------------------------------------------------------------
misc.c

ADD THE FOLLOWING CODE TO THE BOTTOM OF THE FILE (Line 2941 in SWRFUSS 1.2):
//Part of the Formclan snippet By Rojan
//This is an extremely useful function, derived from PHP's explode_string function
//It allows you to divide a string into an array of strings, given a separator
//Example: explode_string("|", "This|is|a|string")
//would give you "This", "is", "a", "string" all as separate entries in an array of strings
char ** explode_string(char separator, char *string)
{
    int start = 0, i, k = 1, count = 2;
    char **strarr;

    for (i = 0; string[i] != '\0'; i++)
        /* how many rows do we need for our array? */
        if (string[i] == separator)
            count++;

    /* count is at least 2 to make room for the entire string
     * and the ending NULL */
    strarr = (char **)malloc(count * sizeof(char *));
    i = 0;

    while (*string++ != '\0')
    {
        if (*string == separator)
        {
            strarr[i] = (char *)malloc(k - start + 2);
            strncpy(strarr[i], string - k + start, k - start + 1);
            strarr[i][k - start + 1] = '\0'; /* guarantee null termination */
            start = k;
            i++;
        }
        k++;
    }
    /* copy the last part of the string after the last separator */
    strarr[i] = (char *)malloc(k - start);
    strncpy(strarr[i], string - k + start, k - start - 1);
    strarr[i][k - start - 1] = '\0'; /* guarantee null termination */
    strarr[++i] = NULL;
    int y,j,c;
    for ( y=0; strarr[y] != NULL; y++ )
    {
        auto char newstr[MAX_STRING_LENGTH];

        for (c =j= 0; strarr[y][c] != '\0'; c++)
            if ( strarr[y][c] != separator )
            {
                newstr[j++] = strarr[y][c];

            }
        newstr[j] = '\0';
        strarr[y] = STRALLOC(newstr);
//log_string(strarr[y]);
    }
    return strarr;
}

----------------------------------------------------------------------
mud.h

FIND THE FOLLOWING (Line 649 in SWRFUSS 1.2):
typedef enum
{
   CLAN_PLAIN, CLAN_CRIME, CLAN_GUILD, CLAN_SUBCLAN
} clan_types;

REPLACE IT WITH:
//Part of the Formclan snippet By Rojan
//Redefined clan types for more variety!
typedef enum { CLAN_MISC, CLAN_LARGEMAN, CLAN_SMALLMAN, CLAN_ENGINEERING, CLAN_GOVERNMENT, CLAN_CRIME, CLAN_SERVICE, CLAN_PARAMILITARY, CLAN_RELIGION, CLAN_MINING } clan_types;


FIND THE FOLLOWING (Line 3973 in SWRFUSS 1.2):
long get_taxes args( ( PLANET_DATA * planet ) );

ADD THE FOLLOWING AFTER THAT LINE:
//Part of the Formclan snippet By Rojan
//Function definitions
void check_dissolves args((void));
void deleteclan args((CLAN_DATA *clan, int reason));
int members_needed args((int clantype,bool dissolve));
int funds_needed args((int clantype,bool dissolve));
char * get_clantype args((CLAN_DATA *clan));
int get_clantypeid args((char * argument));


FIND THE FOLLOWING (Line 4183 in SWRFUSS 1.2 after the above code has been added):
void sith_penalty args( ( CHAR_DATA * ch ) );

ADD THE FOLLOWING AFTER THAT LINE:
char ** explode_string args((char separator, char *string));


FIND THE FOLLOWING (Line 822 in SWRFUSS 1.2 after the above code has been added):
   char *tmpstr;

ADD THE FOLLOWING AFTER THAT LINE:
   //Part of the Formclan snippet By Rojan
//Clan nodissolve flag
   bool nodissolve;

   
FIND THE FOLLOWING (Line 3718 in SWRFUSS 1.2 after the above code has been added):
DECLARE_DO_FUN( do_mpgain );

ADD THE FOLLOWING AFTER THAT LINE:
//Part of the Formclan snippet By Rojan
//Command definitions
DECLARE_DO_FUN( do_removeclan );
DECLARE_DO_FUN( do_dissolveclan );
DECLARE_DO_FUN( do_dissolveloop );
DECLARE_DO_FUN( do_formclan );

----------------------------------------------------------------------
act_info.c

FIND THE FOLLOWING (Line 3191 in SWRFUSS 1.2):
      else if( !str_cmp( arg + 1, "clan" ) && !IS_NPC( ch ) && ch->pcdata->clan
       && ch->pcdata->clan->clan_type != CLAN_GUILD )
         bit = CHANNEL_CLAN;
      else if( !str_cmp( arg + 1, "guild" )  && !IS_NPC( ch ) && ch->pcdata->clan
       && ch->pcdata->clan->clan_type == CLAN_GUILD )
         bit = CHANNEL_GUILD;

REPLACE IT WITH THIS:
//Part of the Formclan snippet By Rojan
//Removed guilds channel, all clans should use the clantalk channel
      else if( !str_cmp( arg + 1, "clan" ) && !IS_NPC( ch ) && ch->pcdata->clan )
         bit = CHANNEL_CLAN;

         
FIND THE FOLLOWING (Line 3709 in SWRFUSS 1.2):
   if( victim->pcdata->clan )
   {
      if( victim->pcdata->clan->clan_type == CLAN_CRIME )
         send_to_char( ", and belongs to the crime family ", ch );
      else if( victim->pcdata->clan->clan_type == CLAN_GUILD )
         send_to_char( ", and belongs to the guild ", ch );
      else
         send_to_char( ", and belongs to organization ", ch );
      send_to_char( victim->pcdata->clan->name, ch );
   }
   
REPLACE IT WITH THIS:
//Part of the Formclan snippet By Rojan
//Reworked whois to fit into the new formclan system
   if( victim->pcdata->clan )
   {
	  send_to_char( ", and belongs to the ", ch );
	  send_to_char( get_clantype(victim->pcdata->clan), ch );
	  send_to_char( " Organization: ", ch );
	  send_to_char( victim->pcdata->clan->name, ch );
   }
   
----------------------------------------------------------------------
clans.c

FIND THE FOLLOWING (Line 775 in SWRFUSS 1.2):
   if( victim->pcdata->clan )
   {
      if( victim->pcdata->clan->clan_type == CLAN_CRIME )
      {
         if( victim->pcdata->clan == clan )
            send_to_char( "This player already belongs to your crime family!\r\n", ch );
         else
            send_to_char( "This player already belongs to an organization!\r\n", ch );
         return;
      }
      else if( victim->pcdata->clan->clan_type == CLAN_GUILD )
      {
         if( victim->pcdata->clan == clan )
            send_to_char( "This player already belongs to your guild!\r\n", ch );
         else
            send_to_char( "This player already belongs to an organization!\r\n", ch );
         return;
      }
      else
      {
         if( victim->pcdata->clan == clan )
            send_to_char( "This player already belongs to your organization!\r\n", ch );
         else
            send_to_char( "This player already belongs to an organization!\r\n", ch );
         return;
      }

   }

REPLACE IT WITH:
//Part of the Formclan snippet By Rojan
//Changed induct to work with the new clans system
   if( victim->pcdata->clan )
   {
         if( victim->pcdata->clan == clan )
            send_to_char( "This player already belongs to your organization!\r\n", ch );
         else
            send_to_char( "This player already belongs to an organization!\r\n", ch );
         return;
   }
   
   
FIND THE FOLLOWING (Line 931 in SWRFUSS 1.2 after modifying above code):
      send_to_char( " leader number1 number2 subclan\r\n", ch );

REPLACE WITH:
//Part of the Formclan snippet By Rojan
//Subclan removed
      send_to_char( " leader number1 number2\r\n", ch );

      
FIND THE FOLLOWING (Line 958 in SWRFUSS 1.2 after modifying above code):
   if( !strcmp( arg2, "subclan" ) )
   {
      CLAN_DATA *subclan;
      subclan = get_clan( argument );
      if( !subclan )
      {
         send_to_char( "Subclan is not a clan.\r\n", ch );
         return;
      }
      if( subclan->clan_type == CLAN_SUBCLAN || subclan->mainclan )
      {
         send_to_char( "Subclan is already part of another organization.\r\n", ch );
         return;
      }
      if( subclan->first_subclan )
      {
         send_to_char( "Subclan has subclans of its own that need removing first.\r\n", ch );
         return;
      }
      subclan->clan_type = CLAN_SUBCLAN;
      subclan->mainclan = clan;
      LINK( subclan, clan->first_subclan, clan->last_subclan, next_subclan, prev_subclan );
      save_clan( clan );
      save_clan( subclan );
      return;
   }
   
REPLACE IT WITH:
//Part of the Formclan snippet By Rojan
//Subclans removed
   if( !strcmp( arg2, "subclan" ) )
   {
	    send_to_char( "Subclans have been removed.\n\r", ch);
        return;
	   /*
      CLAN_DATA *subclan;
      subclan = get_clan( argument );
      if( !subclan )
      {
         send_to_char( "Subclan is not a clan.\r\n", ch );
         return;
      }
      if( subclan->clan_type == CLAN_SUBCLAN || subclan->mainclan )
      {
         send_to_char( "Subclan is already part of another organization.\r\n", ch );
         return;
      }
      if( subclan->first_subclan )
      {
         send_to_char( "Subclan has subclans of its own that need removing first.\r\n", ch );
         return;
      }
      subclan->clan_type = CLAN_SUBCLAN;
      subclan->mainclan = clan;
      LINK( subclan, clan->first_subclan, clan->last_subclan, next_subclan, prev_subclan );
      save_clan( clan );
      save_clan( subclan );
      return;*/
   }
   

FIND THE FOLLOWING (Line 1096 in SWRFUSS 1.2 after modifying above code):
   if( !strcmp( arg2, "type" ) )
   {
      if( clan->mainclan )
      {
         UNLINK( clan, clan->mainclan->first_subclan, clan->mainclan->last_subclan, next_subclan, prev_subclan );
         clan->mainclan = NULL;
      }
      if( !str_cmp( argument, "crime" ) )
         clan->clan_type = CLAN_CRIME;
      else if( !str_cmp( argument, "crime family" ) )
         clan->clan_type = CLAN_CRIME;
      else if( !str_cmp( argument, "guild" ) )
         clan->clan_type = CLAN_GUILD;
      else
         clan->clan_type = 0;
      send_to_char( "Done.\r\n", ch );
      save_clan( clan );
      return;
   }

REPLACE IT WITH:
//Part of the Formclan snippet By Rojan
//Reworked setclan to fit into new clans system
    if ( !strcmp( arg2, "type" ) )
    {
        if ( argument[0] == '\0' )
        {
            send_to_char("&zUsage: setclan <clan> type <value>\n\r", ch );
            send_to_char("&zTypes: large manufacturing, small manufacturing, engineering, government, crime, service, paramilitary, religion, miscellaneous\n\r", ch );
            return;
        }
        if ( clan->mainclan )
        {
            UNLINK ( clan , clan->mainclan->first_subclan, clan->mainclan->last_subclan, next_subclan, prev_subclan );
            clan->mainclan = NULL;
        }
        clan->clan_type = get_clantypeid(argument);
        send_to_char( "Done.\n\r", ch );
        save_clan( clan );
        return;
    }


FIND THE FOLLOWING (Line 1318 in SWRFUSS 1.2 after modifying above code):
   ch_printf( ch, "%s      : %s\r\nFilename: %s\r\n",
              clan->clan_type == CLAN_CRIME ? "Crime Family " :
              clan->clan_type == CLAN_GUILD ? "Guild " : "Organization ", clan->name, clan->filename );

REPLACE IT WITH:
//Part of the Formclan snippet By Rojan
//Reworked showclan to fit into new clans system
   ch_printf( ch, "%s      : %s\r\nFilename: %s\r\n",
              get_clantype(clan), clan->name, clan->filename );

              
FIND THE FOLLOWING (Line 1445 in SWRFUSS 1.2 after modifying above code):
      if( clan->clan_type == CLAN_CRIME || clan->clan_type == CLAN_GUILD || clan->clan_type == CLAN_SUBCLAN )
         continue;

REPLACE IT WITH:
//Part of the Formclan snippet By Rojan
//Reworked clans list to fit into new clans system
      if( clan->clan_type != CLAN_GOVERNMENT )
         continue;

    
FIND THE FOLLOWING (Line 1488 in SWRFUSS 1.2 after modifying above code):
      if( clan->clan_type != CLAN_CRIME && clan->clan_type != CLAN_GUILD )
         continue;
         
REPLACE IT WITH:
//Part of the Formclan snippet By Rojan
//Reworked clans list to fit into new clans system
      if( clan->clan_type == CLAN_GOVERNMENT )
         continue;
         
         
FIND THE FOLLOWING (Line 2127 in SWRFUSS 1.2 after modifying above code):
   if( clan->clan_type == CLAN_CRIME )
   {
      send_to_char( "Crime fimilies aren't in the business of controlling worlds.\r\n", ch );
      return;
   }

   if( clan->clan_type == CLAN_GUILD )
   {
      send_to_char( "Your organization serves a much greater purpose.\r\n", ch );
      return;
   }
         
REPLACE IT WITH:
//Part of the Formclan snippet By Rojan
//Only governments can capture planets
   if( clan->clan_type != CLAN_GOVERNMENT )
   {
      send_to_char( "Only governments can control worlds.\r\n", ch );
      return;
   }
   
   
FIND THE FOLLOWING (Line 163 in SWRFUSS 1.2):
      fprintf( fp, "Jail         %d\n", clan->jail );
         
ADD THE FOLLOWING AFTER THAT LINE:
//Part of the Formclan snippet By Rojan
//Clan nodissolve flag
      fprintf( fp, "NoDissolve   %d\n", clan->nodissolve );
      
      
FIND THE FOLLOWING (Line 300 in SWRFUSS 1.2 after modifying above code):
            KEY( "Name", clan->name, fread_string( fp ) );
         
ADD THE FOLLOWING AFTER THAT LINE:
//Part of the Formclan snippet By Rojan
//Clan nodissolve flag
            KEY( "NoDissolve", clan->nodissolve, fread_number( fp ) );

   
ADD THE FOLLOWING CODE TO THE BOTTOM OF THE FILE (Line 2468 in SWRFUSS 1.2 after modifying above code):
//Part of the Formclan snippet By Rojan
//returns a clan's type name, given the clan
char * get_clantype(CLAN_DATA *clan)
{
    if (clan && clan != NULL)
    {
        return (char *)((clan->clan_type == CLAN_MISC) ? "Miscellaneous" :
                        (clan->clan_type == CLAN_LARGEMAN) ? "Large Manufacturing" :
                        (clan->clan_type == CLAN_SMALLMAN) ? "Small Manufacturing" :
                        (clan->clan_type == CLAN_ENGINEERING) ? "Engineering" :
                        (clan->clan_type == CLAN_GOVERNMENT) ? "Government" :
                        (clan->clan_type == CLAN_CRIME) ? "Crime" :
                        (clan->clan_type == CLAN_SERVICE) ? "Service" :
                        (clan->clan_type == CLAN_PARAMILITARY) ? "Paramilitary" :
                        (clan->clan_type == CLAN_MINING) ? "Mining" :

                        (clan->clan_type == CLAN_RELIGION) ? "Religion" : "Unknown");
    }
    return (char *)"Unknown";
}

//Part of the Formclan snippet By Rojan
//Returns a clan's needed member limit
//Dissolve flag == true indicates that it is the absolute minimum needed not to dissolve
//==false, minimum to create a clan
int members_needed(int clantype,bool dissolve)
{
    if (!dissolve)
    {
        switch (clantype)
        {
        case CLAN_LARGEMAN:
            return 10;
        case CLAN_SMALLMAN:
            return 7;
        case CLAN_ENGINEERING:
            return 5;
        case CLAN_GOVERNMENT:
            return 7;
        case CLAN_CRIME:
            return 6;
        case CLAN_SERVICE:
            return 5;
        case CLAN_PARAMILITARY:
            return 6;
        case CLAN_RELIGION:
            return 5;
        case CLAN_MINING:
            return 3;
        }
    }
    else
    {
        switch (clantype)
        {
        case CLAN_LARGEMAN:
            return 5;
        case CLAN_SMALLMAN:
            return 6;
        case CLAN_ENGINEERING:
            return 3;
        case CLAN_GOVERNMENT:
            return 5;
        case CLAN_CRIME:
            return 4;
        case CLAN_SERVICE:
            return 3;
        case CLAN_PARAMILITARY:
            return 4;
        case CLAN_RELIGION:
            return 2;
        case CLAN_MINING:
            return 3;
        }
    }
    return 0;
}

//Part of the Formclan snippet By Rojan
//Returns a clan's needed funds limit
//Dissolve flag == true indicates that it is the absolute minimum needed not to dissolve
//==false, minimum to create a clan
int funds_needed(int clantype,bool dissolve)
{
    if (!dissolve)
    {
        switch (clantype)
        {
        case CLAN_LARGEMAN:
            return 20000000;
        case CLAN_SMALLMAN:
            return 15000000;
        case CLAN_ENGINEERING:
            return 10000000;
        case CLAN_GOVERNMENT:
            return 12000000;
        case CLAN_CRIME:
            return 7000000;
        case CLAN_SERVICE:
            return 5000000;
        case CLAN_PARAMILITARY:
            return 6000000;
        case CLAN_RELIGION:
            return 3000000;
        case CLAN_MINING:
            return 7000000;
        }
    }
    else
    {
        switch (clantype)
        {
        case CLAN_LARGEMAN:
            return 6000000;
        case CLAN_SMALLMAN:
            return 3000000;
        case CLAN_ENGINEERING:
            return 2000000;
        case CLAN_GOVERNMENT:
            return 5000000;
        case CLAN_CRIME:
            return 5000000;
        case CLAN_SERVICE:
            return 1000000;
        case CLAN_PARAMILITARY:
            return 2000000;
        case CLAN_RELIGION:
            return 1000000;
        case CLAN_MINING:
            return 6000000;
        }
    }
    return 0;
}
/*
 * Syntax: formclan 'clan name' type member1,member2,member3,etc.
 *Clan type - Starting requirements | minimum requirements
 * Large Manufacturing Clan - 20 million credits, 10 members | 6 million credits,
5 members | can build large ships
Small Manufacturing Clan - 15 million, 7 members | 3 million credits, 6 members
| can build small ships
Engineering Clan - 10 million credits, 5 members | 2 million credits , 3
members | creates armor, weapons, etc.
Government Clan - 12 million credits, 7 members | 5 million credits, 5 members
| can govern planet(s)
Crime Clan - 7 million credits, 6 members | 5 million credits 4 members | will
be a hidden clan
Service Clan - 5 million credits, 5 members | 1 million credits 3 members.
Paramilitary - 6 million credits, 6 members | 2 million credits, 4 members
Religion - 3 million credits, 5 members | 1 million credits, 2 members
Mining -  7 million credits, 3 members | 6 million credits, 3 members
misc???
*/
void do_formclan(CHAR_DATA *ch, char * argument)
{
    char filename[256];
    CLAN_DATA *clan;
    CLAN_DATA *clanfind;
    CHAR_DATA *victim;
    int cost = 0;
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    int clantype = 0;
    int x = 0;
    int membercount = 1;
    char ** memberlist;
    if ( IS_NPC( ch ) )
    {
        send_to_char( "Huh?\n\r", ch );
        return;
    }
    if ( !argument || argument[0] == '\0' )
    {
        send_to_char( "Usage: formclan 'clan name' 'clan type' memberlist\n\rMemberlist in format: Member1,Member2,Member3,etc. (no spaces)\n\rEx: formclan 'Shiny Empire' Crime Rojan,Walldo,Asmodean\n\r", ch );
        return;
    }
    if ( ch->pcdata->clan )
    {
        ch_printf( ch , "You will have to resign from %s before you can form a new organization.\n\r", ch->pcdata->clan->name );
        return;
    }
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    clanfind = get_clan( arg1 );
    if (clanfind || clanfind != NULL)
    {
        send_to_char("Try picking a different clan name!\n\r",ch);
        return;
    }
    clantype = get_clantypeid(arg2);
    if (clantype == 0 || clantype == CLAN_MISC)
    {
        send_to_char("No such clan type.\n\r",ch);
        return;
    }
    memberlist = explode_string(',',argument);
    for (x = 0; memberlist[x] != NULL; x++)
    {
        if ( ( victim = get_char_room( ch, memberlist[x] ) ) == NULL )
            ch_printf(ch,"%s is not here.\n\r",memberlist[x]);
        else
        {
            if ( IS_NPC(victim) )
                ch_printf(ch,"%s is an NPC!\n\r",memberlist[x]);
            else if ( victim->pcdata->clan)
                ch_printf(ch,"%s already belongs to an organization.\n\r",memberlist[x]);
            else if ( victim->top_level < 100 )
                ch_printf(ch,"%s is not a high enough level to be a starting member.\n\r",memberlist[x]);
            else
                membercount++;
        }
    }
    if (members_needed(clantype,FALSE) == 0 || members_needed(clantype,FALSE) > membercount)
    {
        ch_printf(ch,"You need %d more valid members to start a clan of that type!\n\r",members_needed(clantype,FALSE) - membercount);
        return;

    }
    if ((cost = funds_needed(clantype,FALSE)) != 0)
    {
        if (ch->main_ability == LEADERSHIP_ABILITY && ch->skill_level[LEADERSHIP_ABILITY] >= 150)
            cost -= (int)(cost*.05);
        if (cost > ch->gold)
        {
            ch_printf(ch,"You need %d more credits to start a clan of that type!\n\r",cost - ch->gold);
            return;
        }
        else
        {
ch->gold -= cost;
do_save(ch,"");
        }
    }


    sprintf( filename, "%s.clan", arg1 );
      if( !is_valid_filename( ch, CLAN_DIR, filename ) )
      {
	      send_to_char("ERROR saving your clan, please contact an Immortal!\n\r",ch);
         return;
     }
    CREATE( clan, CLAN_DATA, 1 );
    LINK( clan, first_clan, last_clan, next, prev );
    clan->next_subclan = NULL;
    clan->prev_subclan = NULL;
    clan->last_subclan = NULL;
    clan->first_subclan = NULL;
    clan->mainclan     = NULL;
    clan->name		= STRALLOC( arg1 );
    clan->description	= STRALLOC( "" );
    clan->leader	= STRALLOC( ch->name );
    clan->number1	= STRALLOC( "" );
    clan->number2	= STRALLOC( "" );
    clan->tmpstr	= STRALLOC( "" );
    clan->filename = str_dup( filename );
    clan->clan_type = clantype;
    clan->tmpstr = STRALLOC( "" );

    save_clan( clan );
    write_clan_list( );
    if (clan && clan != NULL)
    {

        clan->members = 1;
        clan->funds = funds_needed(clantype,FALSE);
        if (!IS_IMMORTAL(ch))
        {
            DISPOSE( ch->pcdata->bestowments );
            ch->pcdata->bestowments = str_dup("");
        }
        ch->pcdata->clan = clan;
        STRFREE(ch->pcdata->clan_name);
        ch->pcdata->clan_name = QUICKLINK( clan->name );
        do_save(ch, "");
        ch_printf(ch,"%s successfully created! Inducting members...\n\r",clan->name);
        for (x = 0; memberlist[x] != NULL; x++)
        {
            if ( ( victim = get_char_room( ch, memberlist[x] ) ) != NULL )
            {
                clan->members++;
                if (!IS_IMMORTAL(victim))
                {
                    DISPOSE( victim->pcdata->bestowments );
                    victim->pcdata->bestowments = str_dup("");
                }
                victim->pcdata->clan = clan;
                STRFREE(victim->pcdata->clan_name);
                victim->pcdata->clan_name = QUICKLINK( clan->name );
                ch_printf(ch,"%s successfully inducted.\n\r",memberlist[x]);
                ch_printf(victim,"You have been inducted into %s.\n\r",clan->name);

                save_char_obj( victim );
            }
        }
        save_char_obj( ch);

        save_clan( clan );

    }
    return;
}

//Part of the Formclan snippet By Rojan
//Returns a clan's type # given a string containing its type name
int get_clantypeid(char * argument)
{
    argument = strlower(argument);
    if ( !str_cmp( argument, "large" ) || !str_cmp(argument,"large manufacturing") )
        return CLAN_LARGEMAN;
    else if ( !str_cmp( argument, "small" ) || !str_cmp(argument,"small manufacturing") )
        return CLAN_SMALLMAN;
    else if ( !str_cmp(argument,"engineering") )
        return CLAN_ENGINEERING;
    else if ( !str_cmp(argument,"government") )
        return CLAN_GOVERNMENT;
    else if ( !str_cmp(argument,"crime") || !str_cmp(argument,"criminal") )
        return CLAN_CRIME;
    else if ( !str_cmp(argument,"service") )
        return CLAN_SERVICE;
    else if ( !str_cmp(argument,"paramilitary") )
        return CLAN_PARAMILITARY;
    else if ( !str_cmp(argument,"mining") || !str_cmp(argument,"mine") )
        return CLAN_MINING;
    else if ( !str_cmp(argument,"religion") )
        return CLAN_RELIGION;
    else if ( !str_cmp(argument,"miscellaneous") || !str_cmp(argument,"misc") )
        return CLAN_MISC;
    else
        return 0;
}

//Part of the Formclan snippet By Rojan
//imm command to run the clan dissolve loop manually
void do_dissolveloop(CHAR_DATA *ch, char * argument)
{
    argument = NULL;
    check_dissolves();
    send_to_char("Done.",ch);
    return;
}

//Part of the Formclan snippet By Rojan
//imm command to manually force a clan to dissolve
void do_dissolveclan(CHAR_DATA *ch, char * argument)
{
    CLAN_DATA *clan;
    if ( argument == '\0' )
    {
        send_to_char( "Syntax: dissolveclan <clan name>\n\r", ch );
        return;
    }
    clan = get_clan( argument );

    if ( !clan )
    {
        send_to_char( "No such clan.\n\r", ch );
        return;
    }
    deleteclan(clan,1);
    if ( (clan = get_clan( argument ) )== NULL)
        send_to_char("Done.",ch);
    else
        send_to_char("Failed!", ch);
    return;
}

//Part of the Formclan snippet By Rojan
//Checks all clans for whether or not they should be dissolved
void check_dissolves(void)
{
    int totalfunds = 0;
    SHIP_DATA *ship=NULL;

    CLAN_DATA *clan=NULL,*cnext = NULL;

    for ( clan = first_clan; clan ; clan = cnext )
    {
        cnext = clan->next;
        if (clan && clan != NULL && clan->name && clan->name != NULL && clan->nodissolve == FALSE)
        {

            if (clan->members < members_needed(clan->clan_type,TRUE))
                deleteclan(clan,1);
            else
            {
                totalfunds = clan->funds;
                for ( ship = first_ship; ship; ship = ship->next )
                {
                    if ( !str_cmp( ship->owner, clan->name ))
                        totalfunds += get_ship_value( ship );

                }
                if (totalfunds < funds_needed(clan->clan_type,TRUE))
                    deleteclan(clan,2);
            }
        }
        else continue;


    }
    return;
}
//Part of the Formclan snippet By Rojan
//Clan deletion function
void deleteclan(CLAN_DATA *clan, int reason)
{
    SHIP_DATA *ship;
    CLAN_DATA *subclan;
    DESCRIPTOR_DATA *d;
    PLANET_DATA *planet;
    char filename[256];
    char tempstr[MAX_STRING_LENGTH];
    if (reason > 0)
    {

        sprintf(tempstr, "[ALERT] Clan %s dissolved due to lack of %s\n\r",clan->name,(reason == 1) ? "members" : "funds");
        log_string(tempstr);

    }
    UNLINK( clan, first_clan, last_clan, next, prev );

    for ( subclan = clan->first_subclan ; subclan ; subclan = subclan->next_subclan )
        subclan->mainclan = NULL;

    for ( d = first_descriptor; d; d = d->next )
    {

        if ( d->character && d->character->pcdata && d->character->pcdata->clan == clan )
        {
            d->character->pcdata->clan = NULL;
            if (reason == 1)
                send_to_char("Your clan has been dissolved due to falling beneath the minimum member limit for its type.\n\r", d->character);
            else if (reason == 2)
                send_to_char("Your clan has been dissolved due to falling beneath the minimum funds limit for its type.\n\r", d->character);

            else
                send_to_char("Your clan has been dissolved.\n\r", d->character);
        }
    }

    for ( planet = first_planet ; planet ; planet = planet->next)
        if ( planet->governed_by == clan )
            planet->governed_by = NULL;

    for ( ship = first_ship; ship; ship = ship->next )
        if ( !str_cmp( ship->owner, clan->name ))
            ship->owner = STRALLOC("");

    if ( clan->filename )
    {
        sprintf( filename, "%s%s", CLAN_DIR, clan->filename );
     remove( filename );

    }

    clan->next_subclan = NULL;
    clan->prev_subclan = NULL;
    clan->last_subclan = NULL;
    clan->first_subclan = NULL;
    clan->mainclan     = NULL;
    if ( clan->name )
        STRFREE(clan->name);
    if ( clan->description )
        STRFREE(clan->description);
    if ( clan->leader )
        STRFREE(clan->leader);
    if ( clan->number1 )
        STRFREE(clan->number1);
    if ( clan->number2 )
        STRFREE(clan->number2);
    if ( clan->tmpstr )
        STRFREE(clan->tmpstr);
    if ( clan->tmpstr )
        STRFREE(clan->tmpstr);
    DISPOSE(clan);
    write_clan_list( );
    clan = NULL;
    return;
}

//Part of the Formclan snippet By Rojan
//Clan deletion command
void do_removeclan( CHAR_DATA *ch, char *argument )
{
    CLAN_DATA *clan;
    if ( !argument || argument[0] == '\0' )
    {
        send_to_char( "Usage: removeclan <clan name>\n\r", ch );
        return;
    }

    if ( !(clan = get_clan(argument)) )
    {
        send_to_char( "No such clan.\n\r", ch );
        return;
    }
    ch_printf(ch, "Clan \"%s\" removed.", clan->name);

    deleteclan(clan,0);

}

----------------------------------------------------------------------
LOG ONTO YOUR IMMORTAL AND RUN THESE COMMANDS:
cedit formclan create do_formclan
cedit formclan level 1
cedit dissolveclan create do_dissolveclan
cedit dissolveclan level 103
cedit dissolveclan log 1
cedit removeclan create do_removeclan
cedit removeclan level 103
cedit removeclan log 1
cedit dissolveloop create do_dissolveloop
cedit dissolveloop level 103
cedit dissolveloop log 1
cedit save

And you're all set!
If you have any questions or comments, feel free to e-mail rojan@legendsofthejedi.com
-Rojan