int main(int argc, char **argv) { DIR *dir; struct dirent *dp; struct clan_array clans = CLAN_ARRAY_ZERO; char path[PATH_MAX]; load_config(); if (argc != 1) { fprintf(stderr, "usage: %s\n", argv[0]); return EXIT_FAILURE; } /* Build in memory the list of all clans with their members */ sprintf(path, "%s/players", config.root); if (!(dir = opendir(path))) return perror(path), EXIT_FAILURE; while ((dp = readdir(dir))) { struct player player; struct clan *clan; if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) continue; if (!read_player(&player, dp->d_name)) continue; if (!(clan = get_clan(&clans, &player))) continue; if (!(add_member(clan, &player))) continue; } closedir(dir); write_clan_array(&clans); return EXIT_SUCCESS; }
void do_clan (CHAR_DATA *ch, char *argument, int cmd) { int zone; int leader_obj_vnum; int member_obj_vnum; int new_flags; int clan_flags; int num_clans = 0; int i; NAME_SWITCH_DATA *name_switch; NAME_SWITCH_DATA *nsp; OBJ_DATA *obj; CLAN_DATA *clan; CLAN_DATA *delete_clan; CHAR_DATA *edit_mob = NULL; CHAR_DATA *tch; char *p; char buf [MAX_STRING_LENGTH] = {'\0'}; char clan_name [MAX_STRING_LENGTH] = {'\0'}; char oldname [MAX_STRING_LENGTH] = {'\0'}; char newname [MAX_STRING_LENGTH] = {'\0'}; char literal [MAX_STRING_LENGTH] = {'\0'}; char name [MAX_STRING_LENGTH] = {'\0'}; char *the_clans [MAX_CLANS] = {'\0'}; if ( IS_NPC (ch) ) { send_to_char ("Sorry, but you can't do this while switched...\n", ch); return; } if ( !*argument ) { send_to_char ("Old clan name -> New clan name\n", ch); send_to_char ("============= =============\n", ch); if ( !clan_name_switch_list ) send_to_char ("No clans set to be renamed.\n", ch); else { for ( nsp = clan_name_switch_list; nsp; nsp = nsp->next ) { snprintf (buf, MAX_STRING_LENGTH, "%-15s %-15s\n", nsp->old_name, nsp->new_name); send_to_char (buf, ch); } } send_to_char ("\nClan Name Full Clan Name\n", ch); send_to_char ("=============== =================================\n", ch); for ( clan = clan_list; clan; clan = clan->next ) { snprintf (buf, MAX_STRING_LENGTH, "%-15s %s\n", clan->name, clan->literal); send_to_char (buf, ch); if ( clan->zone ) { snprintf (buf, MAX_STRING_LENGTH, " Enforcement Zone %d\n", clan->zone); send_to_char (buf, ch); } if ( clan->member_vnum ) { obj = vtoo (clan->member_vnum); snprintf (buf, MAX_STRING_LENGTH, " Member Object (%05d): %s\n", clan->member_vnum, obj ? obj->short_description : "UNDEFINED"); send_to_char (buf, ch); } if ( clan->leader_vnum ) { obj = vtoo (clan->leader_vnum); snprintf (buf, MAX_STRING_LENGTH, " Leader Object (%05d): %s\n", clan->leader_vnum, obj ? obj->short_description : "UNDEFINED"); send_to_char (buf, ch); } } return; } argument = one_argument (argument, buf); if ( !*buf || *buf == '?' ) { send_to_char ("Syntax for modifying PCs:\n\n", ch); send_to_char (" clan set <clan-name> [<clan-flags>]\n", ch); send_to_char (" clan remove <clan-name> (or all)\n", ch); send_to_char ("\nSyntax for modifying clan definitions:\n", ch); send_to_char (" clan rename <oldclanname> <newclanname>\n", ch); send_to_char (" clan unrename <oldclanname> <newclanname>\n", ch); send_to_char (" clan register <name> <enforcement zone> <long name> " "[<leader obj>] [<member obj>]\n", ch); send_to_char (" clan unregister <name>\n", ch); send_to_char (" clan list\n", ch); send_to_char ("\nThe obj vnums are optional. Specify zone 0 if no " "enforcement zone.\n\nExamples:\n", ch); send_to_char (" > clan set tashalwatch member leader\n", ch); send_to_char (" > clan remove tashalwatch\n", ch); send_to_char (" > clan register TashalWatch 10 'Tashal Watch'\n", ch); send_to_char (" > clan unregister tashalwatch\n", ch); send_to_char (" > clan rename 10 TashalWatch\n", ch); send_to_char (" > clan unrename 10 TashalWatch\n", ch); send_to_char (" > clan list\n", ch); return; } if ( !str_cmp (buf, "list") ) { for ( tch = character_list; tch; tch = tch->next ) { if ( tch->deleted ) continue; p = tch->clans; if ( !p || !*p ) continue; while ( get_next_clan (&p, clan_name, &clan_flags) ) { if ( num_clans > MAX_CLANS ) /* Too many in list */ break; for ( i = 0; i < num_clans; i++ ) if ( !str_cmp (clan_name, the_clans [i]) ) break; if ( i >= num_clans ) the_clans [num_clans++] = str_dup (clan_name); } } *b_buf = '\0'; for ( i = 0; i < num_clans; i++ ) { snprintf (b_buf + strlen(b_buf), MAX_STRING_LENGTH, "%-15s", the_clans [i]); if ( i % 5 == 4 ) strcat (b_buf, "\n"); else strcat (b_buf, " "); } page_string (ch->desc, b_buf); return; } if ( !str_cmp (buf, "set") || !str_cmp (buf, "remove") || !str_cmp (buf, "delete") ) { if ( (!ch->pc->edit_mob && !ch->pc->edit_player) || (!(edit_mob = vtom (ch->pc->edit_mob)) && !(edit_mob = ch->pc->edit_player)) ) { send_to_char ("Start by using the MOBILE command.\n", ch); return; } } if ( !str_cmp (buf, "set") ) { argument = one_argument (argument, clan_name); if ( !*clan_name ) { send_to_char ("Expected a clan name after 'add'.\n", ch); return; } new_flags = clan_flags_to_value (argument); if ( get_clan (edit_mob, clan_name, &clan_flags) ) remove_clan (edit_mob, clan_name); clan_flags = 0; while ( 1 ) { argument = one_argument (argument, buf); if ( !*buf ) break; if ( !str_cmp (buf, "member") ) TOGGLE (clan_flags, CLAN_MEMBER) /* {}'s define */ else if ( !str_cmp (buf, "leader") ) /* so no ; needed */ TOGGLE (clan_flags, CLAN_LEADER) else if ( !str_cmp (buf, "recruit") ) TOGGLE (clan_flags, CLAN_RECRUIT) else if ( !str_cmp (buf, "private") ) TOGGLE (clan_flags, CLAN_PRIVATE) else if ( !str_cmp (buf, "corporal") ) TOGGLE (clan_flags, CLAN_CORPORAL) else if ( !str_cmp (buf, "sergeant") ) TOGGLE (clan_flags, CLAN_SERGEANT) else if ( !str_cmp (buf, "lieutenant") ) TOGGLE (clan_flags, CLAN_LIEUTENANT) else if ( !str_cmp (buf, "captain") ) TOGGLE (clan_flags, CLAN_CAPTAIN) else if ( !str_cmp (buf, "general") ) TOGGLE (clan_flags, CLAN_GENERAL) else if ( !str_cmp (buf, "commander") ) TOGGLE (clan_flags, CLAN_COMMANDER) else if ( !str_cmp (buf, "apprentice") ) TOGGLE (clan_flags, CLAN_APPRENTICE) else if ( !str_cmp (buf, "journeyman") ) TOGGLE (clan_flags, CLAN_JOURNEYMAN) else if ( !str_cmp (buf, "master") ) TOGGLE (clan_flags, CLAN_MASTER) else { snprintf (literal, MAX_STRING_LENGTH, "Flag %s is unknown for clans.\n", buf); send_to_char (literal, ch); } } if ( !clan_flags ) clan_flags = CLAN_MEMBER; add_clan (edit_mob, clan_name, clan_flags); if ( edit_mob->mob ) { snprintf (buf, MAX_STRING_LENGTH, "%d mobile(s) in world redefined.\n", redefine_mobiles (edit_mob)); send_to_char (buf, ch); } return; /* Return from n/pc specific uses of clan */ }
void do_castout (CHAR_DATA *ch, char *argument, int cmd) { int clan_flags = 0; int clan_flags2 = 0; CHAR_DATA *victim = NULL; CLAN_DATA *clan = NULL; char *p; char clan_name [80]; char buf [MAX_STRING_LENGTH] = {'\0'}; argument = one_argument (argument, buf); if ( !*buf ) { send_to_char ("Castout whom?\n\r", ch); return; } if ( !(victim = get_char_room_vis (ch, buf)) ) { send_to_char ("Nobody is here by that name.\n\r", ch); return; } argument = one_argument (argument, buf); p = ch->clans; if ( !*buf ) { if ( !get_next_leader (&p, clan_name, &clan_flags) ) { send_to_char ("You are not a leader in that clan. You can't cast out anybody.\n", ch); return; } clan = get_clandef(clan_name); if ( !clan ) { send_to_char ("No such clan, I am afraid.\n", ch); return; } strcpy (clan_name, clan->name); } else if ( get_clan_long_short (ch, buf, &clan_flags) ) { if ( !IS_SET (clan_flags, CLAN_LEADER) && (clan_flags < CLAN_SERGEANT || clan_flags > CLAN_COMMANDER) && !IS_SET (clan_flags, CLAN_MASTER) ) { send_to_char ("You are not a leader in that clan. You cannot cast anyone out.\n", ch); return; } clan = get_clandef_long(buf); if ( !clan ) { send_to_char ("No such clan, I am afraid.\n", ch); return; } strcpy (clan_name, clan->name); } else { send_to_char ("You are not a member of such a clan.\n", ch); return; } if ( !get_clan (victim, clan_name, &clan_flags2) ) { act ("$N is not part of your clan.\n", FALSE, ch, 0, victim, TO_CHAR); return; } if ( IS_SET (clan_flags, CLAN_LEADER) || clan_flags <= clan_flags2 ) { act ("You are not of sufficient rank to cast $N from the clan.\n", FALSE, ch, 0, victim, TO_CHAR | TO_ACT_FORMAT); return; } remove_clan (victim, clan_name); snprintf (buf, MAX_STRING_LENGTH, "$N is no longer a part of %s.", clan->literal); act (buf, FALSE, ch, 0, victim, TO_CHAR); snprintf (buf, MAX_STRING_LENGTH, "$n has stripped you of your clan membership in %s.", clan->literal); act (buf, FALSE, ch, 0, victim, TO_VICT | TO_ACT_FORMAT); snprintf (buf, MAX_STRING_LENGTH, "$n has stripped $N of membership in %s.", clan->literal); act ("$n has stripped $N of clan membership.", FALSE, ch, 0, victim, TO_NOTVICT | TO_ACT_FORMAT); }
void do_invite (CHAR_DATA *ch, char *argument, int cmd) { int clan_flags = 0; char *p = NULL; CHAR_DATA *tch = NULL; CLAN_DATA *clan = NULL; char buf [MAX_STRING_LENGTH] = {'\0'}; char clan_name [MAX_STRING_LENGTH] = {'\0'}; argument = one_argument (argument, buf); if ( !*buf ) { send_to_char ("Invite who?\n\r", ch); return; } if ( !(tch = get_char_room_vis (ch, buf)) ) { send_to_char ("Nobody is here by that name.\n", ch); return; } if ( tch == ch ) { send_to_char ("You can't invite yourself.\n", ch); return; } argument = one_argument (argument, buf); if ( !*buf ) { p = ch->clans; if ( !get_next_leader (&p, clan_name, &clan_flags) ) { send_to_char ("You are not an initiated leader of any clan.\n", ch); return; } if ( (clan = get_clandef (clan_name)) ) { send_to_char ("That clan could not be found in the database.\n", ch); return; } strcpy (buf, clan->name); } else { if ( !get_clan_long_short (ch, buf, &clan_flags) ) { send_to_char ("You are not a member of such a clan.\n", ch); return; } if ( !IS_SET (clan_flags, CLAN_LEADER) && (clan_flags < CLAN_CORPORAL || clan_flags > CLAN_COMMANDER) && !IS_SET (clan_flags, CLAN_MASTER) ) { send_to_char ("You are not a leader of that clan.\n", ch); return; } /* Keep clan_name as the short name */ if ( (clan = get_clandef_long (buf)) ) strcpy (buf, clan->name); } if ( get_clan (tch, buf, &clan_flags) ) { act ("$N is already a clan member.", FALSE, ch, 0, tch, TO_CHAR); return; } if ( tch->delay || tch->fighting ) { act ("$N is busy right now.", FALSE, ch, 0, tch, TO_CHAR); return; } if ( !AWAKE (tch) ) { act ("$N isn't conscious right now.", FALSE, ch, 0, tch, TO_CHAR); return; } clan = get_clandef (buf); tch->delay = IS_NPC (tch) && !tch->desc ? 3 : 120; tch->delay_type = DEL_INVITE; tch->delay_ch = ch; tch->delay_who = str_dup (buf); snprintf (buf, MAX_STRING_LENGTH, "You invite $N to join %s.", clan ? clan->literal : clan_name); act (buf, FALSE, ch, 0, tch, TO_CHAR); snprintf (buf, MAX_STRING_LENGTH, "$N invites you to join %s.", clan ? clan->literal : clan_name); act (buf, FALSE, tch, 0, ch, TO_CHAR); act ("$N whispers something to $n about joining a clan.", FALSE, tch, 0, ch, TO_NOTVICT | TO_ACT_FORMAT); }
void do_bank_clan(Character *ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; arg1[0] = '\0'; arg2[0] = '\0'; long amount; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if (!IS_CLANNED(ch) && !IS_IMMORTAL(ch)) { send_to_char("You are not in a clan.\n\r",ch); return; } if (IS_IMMORTAL(ch)) { CLAN_DATA *clan; int debit; if ((clan = get_clan(arg1)) == NULL) { send_to_char("Syntax: bank clan <clan name> <amount to withdraw (in k)>\n\r",ch); return; } if ((debit = atoi(arg2)) <= 0) { send_to_char("Syntax: bank clan <clan name> <amount to withdraw (in k)>\n\r",ch); return; } if (clan->money < debit * 100000) { send_to_char("The clan doesn't have that much money!\n\r",ch); return; } clan->money -= debit * 100000; ch->gold += debit * 1000; append_file( ch, UPGRADE_FILE, argument ); save_clan(clan); return; } else { if (str_cmp(ch->pcdata->clan->leader, ch->getName() )) { send_to_char("Only your clan leader may access the clan account.\n\r", ch); return; } if (arg2[0] == '\0' || (str_cmp(arg2, "gold") && str_cmp(arg2, "silver"))) { send_to_char("Syntax: bank clan (+/- amount) (gold/silver)\n\r",ch); return; } if (!str_cmp(arg2, "gold")) amount = atoi(arg1) * 100; else amount = atoi(arg1); if ( amount == 0 ) { send_to_char("Nothing much happens.\n\r", ch); return; } if ( amount < 0 && amount * -1 > ch->pcdata->clan->money ) { send_to_char("You cannot withdraw more than your clan has.\n\r", ch); return; } if ((ch->gold * 100) + ch->silver < amount && amount > 0) { send_to_char("You cannot afford to deposit that much.\n\r",ch); return; } if (amount > 0) { if (ch->silver < amount) { ch->gold -= ((amount - ch->silver + 99) / 100); ch->silver -= amount - (100 * ((amount - ch->silver + 99) / 100)); } else ch->silver -= amount; } ch->pcdata->clan->money += amount; save_clan(ch->pcdata->clan); if ( amount < 0 ) { amount = amount * -1; ch->gold += amount / 100; ch->silver += amount - (amount / 100); send_to_char("You withdraw from your clan fund.\n\r",ch); return; } else { send_to_char("You add to your clan fund.\n\r",ch); return; } } }
void fread_pfile( FILE * fp, time_t tdiff, char *fname, bool count ) { char *word; char *name = NULL; char *clan = NULL; short level = 0; short file_ver = 0; int pact2; bool fMatch; ROOM_INDEX_DATA *plr_home; char homebuf[MSL]; for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Act2", pact2, fread_number( fp ) ); break; case 'C': KEY( "Clan", clan, fread_string( fp ) ); break; case 'E': if( !strcmp( word, "End" ) ) goto timecheck; break; case 'T': KEY( "Toplevel", level, fread_number( fp ) ); break; case 'N': KEY( "Name", name, fread_string( fp ) ); break; case 'P': if ( !str_cmp( word, "PlrHome" ) ) { plr_home = get_room_index( fread_number( fp ) ); break; } break; case 'V': KEY( "Version", file_ver, fread_number( fp ) ); break; } if( !fMatch ) fread_to_eol( fp ); } timecheck: if( count == FALSE && !IS_SET( pact2, ACT_EXEMPT ) ) { if( (level < 10) && (tdiff > sysdata.newbie_purge) ) { if( unlink( fname ) == -1 ) perror( "Unlink" ); else { sprintf( homebuf, "%s%c/%s.home", PLAYER_DIR, tolower(name[0]), name); if ( !remove(homebuf) ) { STRFREE( plr_home->name ); plr_home->name = STRALLOC( "An Empty Apartment" ); REMOVE_BIT( plr_home->room_flags , ROOM_PLR_HOME ); SET_BIT( plr_home->room_flags , ROOM_EMPTY_HOME ); fold_area( plr_home->area, plr_home->area->filename, FALSE ); } days = sysdata.newbie_purge; sprintf( log_buf, "Player %s was deleted. Exceeded time limit of %d days.", name, days ); log_string( log_buf ); #ifdef AUTO_AUTH remove_from_auth( name ); #endif deleted++; } } if( (level < LEVEL_IMMORTAL) && (tdiff > sysdata.regular_purge) ) { if( level < LEVEL_IMMORTAL ) { if( unlink( fname ) == -1 ) perror( "Unlink" ); else { sprintf( homebuf, "%s%c/%s.home", PLAYER_DIR, tolower(name[0]), name); if ( !remove(homebuf) ) { STRFREE( plr_home->name ); plr_home->name = STRALLOC( "An Empty Apartment" ); REMOVE_BIT( plr_home->room_flags , ROOM_PLR_HOME ); SET_BIT( plr_home->room_flags , ROOM_EMPTY_HOME ); fold_area( plr_home->area, plr_home->area->filename, FALSE ); } days = sysdata.regular_purge; sprintf( log_buf, "Player %s was deleted. Exceeded time limit of %d days.", name, days ); log_string( log_buf ); #ifdef AUTO_AUTH remove_from_auth( name ); #endif deleted++; } } } } if( clan != NULL ) { CLAN_DATA *guild = get_clan( clan ); if( guild ) guild->members++; } if( name ) STRFREE(name); if( clan ) STRFREE(clan); return; }
void fread_pfile( FILE * fp, time_t tdiff, char *fname, bool count ) { const char *word; char *name = NULL; char *clan = NULL; char *deity = NULL; short level = 0; short file_ver = 0; EXT_BV pact; bool fMatch; for( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Act", pact, fread_bitvector( fp ) ); break; case 'C': KEY( "Clan", clan, fread_string( fp ) ); break; case 'D': KEY( "Deity", deity, fread_string( fp ) ); break; case 'E': if( !strcmp( word, "End" ) ) goto timecheck; break; case 'L': KEY( "Level", level, fread_number( fp ) ); break; case 'N': KEY( "Name", name, fread_string( fp ) ); break; case 'V': KEY( "Version", file_ver, fread_number( fp ) ); break; } if( !fMatch ) fread_to_eol( fp ); } timecheck: if( count == FALSE && !xIS_SET( pact, PLR_EXEMPT ) ) { if( level < 10 && tdiff > sysdata.newbie_purge ) { if( unlink( fname ) == -1 ) perror( "Unlink" ); else { days = sysdata.newbie_purge; snprintf( log_buf, MAX_STRING_LENGTH, "Player %s was deleted. Exceeded time limit of %d days.", name, days ); log_string( log_buf ); #ifdef AUTO_AUTH remove_from_auth( name ); #endif deleted++; return; } } if( level < LEVEL_IMMORTAL && tdiff > sysdata.regular_purge ) { if( level < LEVEL_IMMORTAL ) { if( unlink( fname ) == -1 ) perror( "Unlink" ); else { days = sysdata.regular_purge; snprintf( log_buf, MAX_STRING_LENGTH, "Player %s was deleted. Exceeded time limit of %d days.", name, days ); log_string( log_buf ); #ifdef AUTO_AUTH remove_from_auth( name ); #endif deleted++; return; } } } } if( clan != NULL ) { CLAN_DATA *guild = get_clan( clan ); if( guild ) guild->members++; } if( deity != NULL ) { DEITY_DATA *god = get_deity( deity ); if( god ) god->worshippers++; } if( clan ) STRFREE( clan ); if( name ) STRFREE( name ); if( deity ) STRFREE( deity ); return; }