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 type \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 \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 \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