/*************************************************************************** * Mud20 1.0 by Todd H. Johnson (Kregor) a derivative of the Open Gaming * * License by Wizards of the Coast. All comments referring to D20, OGL, * * and SRD refer to the System Reference Document for the Open Gaming * * system. Any inclusion of these derivatives must include credit to the * * Mud20 system, the full and complete Open Gaming LIcense, and credit to * * the respective authors. See ../doc/srd.txt for more information. * * * * Emud 2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem. * * * * MrMud 1.4 by David Bills, Dug Michael and Martin Gallwey * * * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * Original Diku Mud copyright (C) 1990 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeld, Tom Madsen, and Katje Nyboe. * ***************************************************************************/ /*************************************************************************** * clans.c: All clan creation and management functions * ***************************************************************************/ #include "mud.h" void fread_clan args( ( CLAN_DATA *clan, FILE *fp ) ); bool load_clan args( ( char *clanname ) ); void save_clan_list args( ( void ) ); CLAN_DATA *get_clan( char *name ) { CLAN_DATA *clan; push_call("get_clan(%p)",name); for (clan = mud->f_clan ; clan ; clan = clan->next) { if (!str_prefix(name, clan->name)) { pop_call(); return clan; } } pop_call(); return NULL; } CLAN_DATA *get_clan_from_vnum( int vnum ) { CLAN_DATA *clan; push_call("get_clan_from_vnum(%p)",vnum); for (clan = mud->f_clan ; clan ; clan = clan->next) { if (vnum == clan->founder_pvnum) { pop_call(); return clan; } } pop_call(); return NULL; } bool is_clan_leader( CHAR_DATA *ch ) { push_call("is_clan_leader(%p)",ch); if (IS_NPC(ch) || ch->pcdata->clan == NULL) { pop_call(); return FALSE; } if (!strcasecmp(ch->name, ch->pcdata->clan->leader[ch->pcdata->clan_position])) { pop_call(); return TRUE; } pop_call(); return FALSE; } void sort_clans ( CLAN_DATA *clan ) { CLAN_DATA *temp_clan; push_call("sort_clans(%p)",clan); for (temp_clan = mud->f_clan ; temp_clan ; temp_clan = temp_clan->next) { if (strcmp(clan->name, temp_clan->name) < 0) { INSERT_LEFT(clan, temp_clan, mud->f_clan, next, prev); break; } } if (temp_clan == NULL) { LINK(clan, mud->f_clan, mud->l_clan, next, prev); } pop_call(); return; } void save_clan_list( ) { CLAN_DATA *clan; FILE *fp; char templist[50], clanlist[50]; push_call("save_clan_list()"); sprintf(clanlist, "%s/clan.lst", CLAN_DIR); sprintf(templist, "%s/clan.tmp", CLAN_DIR); close_reserve(); if ((fp = my_fopen(templist, "w", FALSE)) == NULL) { log_printf("save_clan_list: failed to open %s", templist); pop_call(); return; } for (clan = mud->f_clan ; clan ; clan = clan->next) { fprintf(fp, "C %s\n", clan->filename); } fprintf(fp, "$\nXXXXXXXXXX\n#Clans\n" ); my_fclose(fp); if (is_valid_save(templist, "Clans")) { rename(templist, clanlist); } open_reserve(); pop_call(); return; } void save_all_clans( ) { CLAN_DATA *clan; push_call("save_all_clans()"); for (clan = mud->f_clan ; clan ; clan = clan->next) { save_clan(clan); } pop_call(); return; } void save_clan( CLAN_DATA *clan ) { FILE *fp; char filename[50], tempfile[50]; bool cnt; push_call("save_clan(%p)",clan); if (clan == NULL) { log_printf("save_clan: null pointer"); pop_call(); return; } sprintf(filename, "%s/%s", CLAN_DIR, clan->filename); sprintf(tempfile, "%s/%s.tmp", CLAN_DIR, clan->filename); close_reserve(); if ((fp = my_fopen(tempfile, "w", FALSE)) == NULL) { perror(tempfile); open_reserve(); pop_call(); return; } fprintf(fp, "#CLAN\n"); fprintf(fp, "Name %s~\n", clan->name ); fprintf(fp, "Motto %s~\n", clan->motto ); fprintf(fp, "FileName %s~\n", clan->filename ); fprintf(fp, "Email %s~\n", clan->email ); for (cnt = 0 ; cnt < 5 ; cnt++) { fprintf(fp, "Leader%d %s~\n", cnt, clan->leader[cnt]); } for (cnt = 0 ; cnt < 5 ; cnt++) { fprintf(fp, "PKill %d %d\n", cnt, clan->pkills[cnt]); } for (cnt = 0 ; cnt < 5 ; cnt++) { fprintf(fp, "PDeath %d %d\n", cnt, clan->pdeaths[cnt]); } fprintf(fp, "MKills %d\n", clan->mkills ); fprintf(fp, "MDeaths %d\n", clan->mdeaths ); fprintf(fp, "Members %d\n", clan->members ); fprintf(fp, "Founder %d\n", clan->founder_pvnum ); fprintf(fp, "Tax %d\n", clan->tax ); fprintf(fp, "Coffers %lld\n", clan->coffers ); fprintf(fp, "Home %d\n", clan->home ); fprintf(fp, "Store %d\n", clan->store ); fprintf(fp, "Guards %d\n", clan->num_guards ); fprintf(fp, "Healers %d\n", clan->num_healers ); fprintf(fp, "Trainers %d\n", clan->num_trainers ); fprintf(fp, "Banks %d\n", clan->num_banks ); fprintf(fp, "Morgues %d\n", clan->num_morgues ); fprintf(fp, "Altars %d\n", clan->num_altars ); fprintf(fp, "Backdoors %d\n", clan->num_backdoors ); fprintf(fp, "End\n\n" ); save_clan_pit(clan, fp); fprintf(fp, "#END\n\n" ); fprintf(fp, "#Clanfile\n" ); my_fclose( fp ); if (is_valid_save(tempfile, "Clanfile")) { rename(tempfile, filename); } open_reserve(); pop_call(); return; } void fread_clan( CLAN_DATA *clan, FILE *fp ) { char *word; bool fMatch; bool cnt; push_call("fread_clan(%p,%p)",clan,fp); for ( ; ; ) { word = feof(fp) ? "End" : fread_word(fp); fMatch = FALSE; switch (word[0]) { case 'A': NKEY("Altars", clan->num_altars, fread_number(fp)); break; case 'B': NKEY("Backdoors", clan->num_backdoors, fread_number(fp)); NKEY("Banks", clan->num_banks, fread_number(fp)); break; case 'C': NKEY( "Coffers", clan->coffers, fread_number(fp)); break; case 'E': SKEY( "Email", clan->email, fread_string(fp)); if (!strcmp(word, "End")) { pop_call(); return; } break; case 'F': SKEY( "FileName", clan->filename, fread_string(fp)); NKEY( "Founder", clan->founder_pvnum, fread_number(fp)); break; case 'G': NKEY( "Guards", clan->num_guards, fread_number(fp)); break; case 'H': NKEY( "Home", clan->home, fread_number(fp)); NKEY( "Healers", clan->num_healers, fread_number(fp)); break; case 'L': SKEY( "Leader0", clan->leader[0], fread_string(fp)); SKEY( "Leader1", clan->leader[1], fread_string(fp)); SKEY( "Leader2", clan->leader[2], fread_string(fp)); SKEY( "Leader3", clan->leader[3], fread_string(fp)); SKEY( "Leader4", clan->leader[4], fread_string(fp)); break; case 'M': NKEY("MDeaths", clan->mdeaths, fread_number(fp)); NKEY("MKills", clan->mkills, fread_number(fp)); NKEY("Members", clan->members, fread_number(fp)); NKEY("Morgues", clan->num_morgues, fread_number(fp)); SKEY("Motto", clan->motto, fread_string(fp)); break; case 'N': SKEY( "Name", clan->name, fread_string(fp)); break; case 'P': AKEY("PDeath", clan->pdeaths, fread_number(fp)); AKEY("PKill", clan->pkills, fread_number(fp)); break; case 'S': NKEY("Store", clan->store, fread_number(fp)); break; case 'T': NKEY("Tax", clan->tax, fread_number(fp)); NKEY("Trainers", clan->num_trainers, fread_number(fp)); break; } if (fMatch == FALSE) { log_printf("fread_clan: no match: %s %s", word, fread_line(fp)); } } pop_call(); return; } bool load_clan( char *clanname ) { char filename[256]; CLAN_DATA *clan; FILE *fp; char found, loop, letter, *word; push_call("load_clan(%p)",clanname); log_printf("Loading %s..", clanname); ALLOCMEM(clan, CLAN_DATA, 1); clan->name = STRALLOC( "" ); clan->description = STRALLOC( "" ); clan->motto = STRALLOC( "" ); clan->leader[0] = STRALLOC( "" ); clan->leader[1] = STRALLOC( "" ); clan->leader[2] = STRALLOC( "" ); clan->leader[3] = STRALLOC( "" ); clan->leader[4] = STRALLOC( "" ); clan->email = STRALLOC( "" ); found = FALSE; sprintf(filename, "%s/%s", CLAN_DIR, clanname); if ((fp = my_fopen(filename, "r", FALSE)) != NULL) { for (found = loop = TRUE ; loop ; ) { letter = fread_letter( fp ); if (letter != '#') { log_printf("Load_clan_file: # not found: %s", clanname); break; } word = fread_word(fp); switch (word[0]) { case 'C': fread_clan( clan, fp ); break; case 'P': load_clan_pit(fp); break; case 'E': loop = FALSE; break; default: log_printf("load_clan: bad section: %s", word); loop = FALSE; break; } } my_fclose( fp ); } sort_clans ( clan ); pop_call(); return found; } void load_clans( ) { FILE *fp; char *filename; char clanlist[50], letter; push_call("load_clans()"); log_string( "Loading clans..." ); sprintf(clanlist, "%s/clan.lst", CLAN_DIR); close_reserve(); if ((fp = my_fopen(clanlist, "r", FALSE)) == NULL) { perror(clanlist); exit (1); } for ( ; ; ) { letter = fread_letter(fp); if (letter != 'C') { if (letter != '$') { log_printf("***WARNING*** load_clans: bad format"); } break; } filename = fread_word(fp); if (load_clan(filename) == FALSE) { log_printf("load_clans: failed to load %s", filename); } } my_fclose(fp); open_reserve(); pop_call(); return; } void do_initiate( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; CLAN_DATA *clan; push_call("do_initiate(%p,%p)",ch,argument); if (!is_clan_leader(ch)) { ch_printf_color(ch, "You must be a clan leader to initiate.\n\r"); pop_call(); return; } clan = ch->pcdata->clan; argument = one_argument(argument, arg); if (arg[0] == '\0') { ch_printf_color(ch, "Initiate whom?\n\r"); pop_call(); return; } if ((victim = get_char_room(ch, arg)) == NULL) { ch_printf_color(ch, "They aren't here.\n\r"); pop_call(); return; } if (IS_NPC(victim)) { ch_printf_color(ch, "%s cannot be initiated.\n\r", capitalize(get_name(victim))); pop_call(); return; } if (IS_SET(victim->act, PLR_OUTCAST)) { ch_printf_color(ch, "%s is an outcast, look elsewhere for new recruits.\n\r", get_name(victim)); pop_call(); return; } if (IS_IMMORTAL(victim)) { send_to_char( "You cannot initiate such a divine being.\n\r", ch ); pop_call(); return; } if (clan->coffers < 5000000) { send_to_char("Your clan is too poor to pay for this initiation.\n\r", ch); pop_call(); return; } if (victim->pcdata->clan) { ch_printf_color(ch, "%s is already a member of a clan.\n\r", get_name(victim)); pop_call(); return; } RESTRING(victim->pcdata->clan_pledge, clan->name); ch->pcdata->clan->coffers -= 5000000; ch_printf_color(ch, "Your clan pays 50,000 gold coins on an initiation rite for %s.\n\r", get_name(victim)); act( "$n initiates $N in the ways of $t.", ch, clan->name, victim, TO_NOTVICT ); act( "$n initiates you in the ways of $t.\n\rYou must pledge your support to $t to become a full member.", ch, clan->name, victim, TO_VICT ); pop_call(); return; } void do_nominate( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; CHAR_DATA *victim; CLAN_DATA *clan; int position = 0; push_call("do_nominate(%p,%p)",ch,argument); if (IS_NPC(ch) || ch->pcdata->clan == NULL) { send_to_char("You are not a member of a clan.\n\r", ch ); pop_call(); return; } clan = ch->pcdata->clan; if (strcasecmp(ch->name, clan->leader[0])) { ch_printf_color(ch, "Only %s can nominate new leaders.\n\r", clan->leader[0]); pop_call(); return; } argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char( "Nominate whom?\n\r", ch ); pop_call(); return; } if ((victim = get_char_room(ch, arg1)) == NULL) { send_to_char( "They aren't here.\n\r", ch); pop_call(); return; } if (!strcasecmp(arg2, "number1")) { position = 1; } else if (!strcasecmp(arg2, "number2")) { position = 2; } else if (!strcasecmp(arg2, "number3")) { position = 3; } else if (!strcasecmp(arg2, "number4")) { position = 4; } else { ch_printf_color(ch, "Nominate %s for what position ?\n\rSyntax: nominate <player> <number1|number2|number3|number4>\n\r", arg1); pop_call(); return; } if (IS_NPC(victim) || victim->pcdata->clan != clan) { ch_printf_color(ch, "%s isn't a member of %s", get_name(victim), clan->name); pop_call(); return; } if (clan->coffers < 10000000) { send_to_char( "Your clan is too poor to pay for this nomination.\n\r", ch ); pop_call(); return; } if (victim->pcdata->clan_position) { RESTRING(clan->leader[victim->pcdata->clan_position], ""); } RESTRING(clan->leader[position], victim->name); ch_printf_color(victim, "You now hold the position of number %d in %s.\n\r", position, clan->name); ch_printf_color(ch, "%s now holds the position of number %d in %s.\n\r", get_name(victim), position, clan->name); clan->coffers -= 10000000; victim->pcdata->clan_position = position; pop_call(); return; } void do_pledge( CHAR_DATA *ch, char *argument ) { CLAN_DATA *clan; push_call("do_pledge(%p,%p)",ch,argument); if (IS_NPC(ch)) { pop_call(); return; } if (IS_SET(ch->act, PLR_OUTCAST)) { send_to_char( "You are an outcast and may not pledge support to a new clan.\n\r", ch); pop_call(); return; } if (ch->pcdata->clan) { send_to_char( "You are already in a clan!\n\r", ch ); pop_call(); return; } if ((clan = get_clan(argument)) == NULL) { send_to_char( "That clan does not exist!\n\r", ch ); pop_call(); return; } if (strcasecmp(clan->name, ch->pcdata->clan_pledge)) { send_to_char( "That clan has not initiated you!\n\r", ch); pop_call(); return; } clan->members++; RESTRING(ch->pcdata->clan_name, clan->name); RESTRING(ch->pcdata->clan_pledge, ""); ch->pcdata->clan = clan; ch->pcdata->clan_position = 0; act( "You pledge support to $t.", ch, clan->name, NULL, TO_CHAR ); act( "$n pledges support to $t.", ch, clan->name, NULL, TO_ROOM ); pop_call(); return; } void do_renounce( CHAR_DATA *ch, char *argument ) { CLAN_DATA *clan; push_call("do_renounce(%p,%p)",ch,argument); if (IS_NPC(ch) || ch->pcdata->clan == NULL) { send_to_char( "You aren't a member of a clan.\n\r", ch ); pop_call(); return; } clan = ch->pcdata->clan; if (argument[0] == '\0') { send_to_char("You must use a password with this command.\n\rThis command will cut your ties with your clan.\n\r", ch); pop_call(); return; } if (encrypt64(argument) != ch->pcdata->password) { send_to_char( "That was not your password.\n\r", ch); pop_call(); return; } ch_printf_color(ch, "You turn your back on %s.\n\r", ch->pcdata->clan_name); if (!strcasecmp(ch->name, ch->pcdata->clan->leader[0])) { destroy_clan(ch->pcdata->clan); pop_call(); return; } clan->members--; if (is_clan_leader(ch)) { RESTRING(ch->pcdata->clan->leader[ch->pcdata->clan_position], ""); } ch->pcdata->clan = NULL; RESTRING(ch->pcdata->clan_name, ""); pop_call(); return; } void do_outcast( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; CLAN_DATA *clan; char buf[MAX_STRING_LENGTH]; push_call("do_outcast(%p,%p)",ch,argument); if (!is_clan_leader(ch)) { send_to_char("You must be a clan leader to outcast.\n\r", ch ); pop_call(); return; } clan = ch->pcdata->clan; if (*argument == '\0') { send_to_char( "Outcast whom?\n\r", ch ); pop_call(); return; } if ((victim = get_player_world(ch, argument)) == NULL) { ch_printf_color(ch, "%s does not seem to be playing", argument); pop_call(); return; } if (victim == ch) { ch_printf_color(ch, "Use renounce instead.\n\r"); pop_call(); return; } if (victim->pcdata->clan != ch->pcdata->clan) { ch_printf_color(ch, "%s does not belong to your clan.\n\r", get_name(victim)); pop_call(); return; } if (is_clan_leader(victim) && strcasecmp(ch->name, clan->leader[0])) { ch_printf_color(ch, "Only %s may outcast clan leaders.", clan->leader[0]); pop_call(); return; } clan->members--; if (is_clan_leader(victim)) { RESTRING(clan->leader[victim->pcdata->clan_position], ""); } RESTRING(victim->pcdata->clan_name, ""); victim->pcdata->clan = NULL; char_to_room(victim, ROOM_VNUM_TEMPLE, TRUE); victim->pcdata->recall = victim->pcdata->death_room = ROOM_VNUM_TEMPLE; SET_BIT(victim->act, PLR_OUTCAST); victim->pcdata->outcast_played = victim->pcdata->played; sprintf(buf, "%s has been kicked out of %s!", victim->name, clan->name); do_echo(ch, buf); pop_call(); return; } void do_clans( CHAR_DATA *ch, char *argument ) { CLAN_DATA *clan; int count = 0; push_call("do_clans(%p,%p)",ch,argument); if (argument[0] == '\0') { send_to_char_color( "{128}\n\rClan Founder Pkills Pdeaths Members\n\r", ch); send_to_char_color( "{118}--------------------------------------------------------------------------------\n\r", ch ); for (clan = mud->f_clan ; clan ; clan = clan->next) { ch_printf_color(ch, "{138}%-13s %-13s %10d %10d %10d\n\r", clan->name, clan->leader[0], clan->pkills[0]+clan->pkills[1]+clan->pkills[2]+clan->pkills[3]+clan->pkills[4], clan->pdeaths[0]+clan->pdeaths[1]+ clan->pdeaths[2]+clan->pdeaths[3]+clan->pdeaths[4], clan->members); count++; } if (!count) { send_to_char_color( "{118}--------------------------------------------------------------------------------\n\r{138}There are no Clans currently formed.\n\r", ch); } else { send_to_char_color( "{118}--------------------------------------------------------------------------------\n\r", ch); } pop_call(); return; } clan = get_clan( argument ); if (!clan) { send_to_char_color( "{118}No such clan.\n\r", ch ); pop_call(); return; } ch_printf_color( ch, "{118}%s, '%s'\n\r\n\r", clan->name, clan->motto ); ch_printf_color( ch, "{078}Clan Leaders: {178}%s %s %s %s %s\n\r", clan->leader[0], clan->leader[1], clan->leader[2], clan->leader[3], clan->leader[4]); ch_printf_color( ch, "{078} Email: {178}%s\n\r", clan->email ); if (IS_IMMORTAL(ch) || (is_clan_leader(ch) && ch->pcdata->clan == clan)) { ch_printf_color( ch, "{078} Members:{178} %10d{078} Tax Rate:{178} %10d{078} Coffers:{178} %10lld\n\r", clan->members, clan->tax, clan->coffers ); ch_printf_color( ch, "{078} Guards:{178} %10d{078} Healers:{178} %10d{078} Back Doors:{178} %10d\n\r", clan->num_guards, clan->num_healers, clan->num_backdoors); ch_printf_color( ch, "{078} Trainers:{178} %10d{078} Banks:{178} %10d{078} Morgues:{178} %10d\n\r", clan->num_trainers, clan->num_banks, clan->num_morgues); ch_printf_color( ch, "{078} Altars:{178} %10d{078}\n\r", clan->num_altars); } if (IS_IMMORTAL(ch)) { ch_printf_color( ch, "{078} Home:{178} %10d{078} Store:{178} %10d{078} Founder Vnum:{178} %10d\n\r", clan->home, clan->store, clan->founder_pvnum); ch_printf_color( ch, "{078} Mob Kills:{178} %10d{078} Mob Deaths:{178} %10d\n\r", clan->mkills, clan->mdeaths); } pop_call(); return; } void do_clan_rent( CHAR_DATA *ch, char *argument ) { CLAN_DATA *clan; int rent = RENT_BASIC_CLAN_HALL; push_call("do_clan_rent(%p,%p)",ch,argument); if (!IS_IMMORTAL(ch) && !is_clan_leader(ch)) { send_to_char("Only clan leaders can see the clan's rent.\n\r", ch); pop_call(); return; } if (!IS_IMMORTAL(ch)) { clan = ch->pcdata->clan; } else if (argument[0] == '\0' || (clan = get_clan(argument)) == NULL) { send_to_char("Syntax: rent <clan>\n\r", ch); pop_call(); return; } ch_printf_color(ch, "{128}Type Amount Cost Total\n\r"); ch_printf_color(ch, "{118}--------------------------------------------------------------------------------\n\r"); ch_printf_color(ch, "{178}%-14s{138} %7d %'14d %'14s\n\r", "Basic Hall", 1, RENT_BASIC_CLAN_HALL, format_coins(RENT_BASIC_CLAN_HALL,FALSE)); if (clan->num_healers > 0) { ch_printf_color(ch, "{178}%-14s{138} %7d %14d %14s\n\r", "Healers", clan->num_healers, RENT_PER_HEALER, format_coins(RENT_PER_HEALER * clan->num_healers,FALSE)); rent += RENT_PER_HEALER * clan->num_healers; } if (clan->num_guards > 0) { ch_printf_color(ch, "{178}%-14s{138} %7d %14d %14s\n\r", "Guards", clan->num_guards, RENT_PER_GUARD, format_coins(RENT_PER_GUARD * clan->num_guards,FALSE)); rent += RENT_PER_GUARD * clan->num_guards; } if (clan->num_backdoors > 0) { ch_printf_color(ch, "{178}%-14s{138} %7d %14d %14s\n\r", "Backdoors", clan->num_backdoors, RENT_PER_BACKDOOR, format_coins(RENT_PER_BACKDOOR * clan->num_backdoors,FALSE)); rent += clan->num_backdoors * RENT_PER_BACKDOOR; } if (clan->num_trainers > 0) { ch_printf_color(ch, "{178}%-14s{138} %7d %14d %14s\n\r", "Trainers", clan->num_trainers, RENT_PER_TRAINER, format_coins(RENT_PER_TRAINER * clan->num_trainers,FALSE)); rent += RENT_PER_TRAINER * clan->num_trainers; } if (clan->num_banks > 0) { ch_printf_color(ch, "{178}%-14s{138} %7d %14d %14s\n\r", "Banks", clan->num_banks, RENT_PER_BANK, format_coins(RENT_PER_BANK * clan->num_banks,FALSE)); rent += RENT_PER_BANK * clan->num_banks; } if (clan->num_morgues > 0) { ch_printf_color(ch, "{178}%-14s{138} %7d %14d %14s\n\r", "Morgues", clan->num_morgues, RENT_PER_MORGUE, format_coins(RENT_PER_MORGUE * clan->num_morgues,FALSE)); rent += RENT_PER_MORGUE * clan->num_morgues; } if (clan->num_altars > 0) { ch_printf_color(ch, "{178}%-14s{138} %7d %14d %14s\n\r", "Altars", clan->num_altars, RENT_PER_ALTAR, format_coins(RENT_PER_ALTAR * clan->num_altars,FALSE)); rent += RENT_PER_ALTAR * clan->num_altars; } ch_printf_color(ch, "{118}--------------------------------------------------------------------------------\n\r"); ch_printf_color(ch, "{128}%-14s{138} %7s %14s %14s\n\r", "Total", "", "", format_coins(rent,FALSE)); ch_printf_color(ch, "{118}--------------------------------------------------------------------------------\n\r"); ch_printf_color(ch, "{168}Rent is due on every saturday night.\n\r"); pop_call(); return; } void do_clanwhere( CHAR_DATA *ch, char *argument ) { PLAYER_GAME *fpl; char buf[MAX_STRING_LENGTH]; push_call("do_clanwhere(%p,%p)",ch,argument); if (!is_clan_leader(ch)) { send_to_char( "You are not a clan leader.\n\r", ch ); pop_call(); return; } sprintf(buf, "{128}%-12s %-38s %-24s\n\r", "Player", "Location", "Area"); strcat(buf, "{118}--------------------------------------------------------------------------------"); for (fpl = mud->f_player ; fpl ; fpl = fpl->next) { if (fpl->ch->pcdata->clan && fpl->ch->pcdata->clan == ch->pcdata->clan) { cat_snprintf(buf, 19, "\n\r{178}%-12s", fpl->ch->name); cat_snprintf(buf, 40, " %-38s", fpl->ch->in_room->name); cat_snprintf(buf, 26, " %-24s", fpl->ch->in_room->area->name); } } strcat(buf, "\n\r{118}--------------------------------------------------------------------------------\n\r"); send_to_char_color(buf, ch); pop_call(); return; } void do_makeclan( CHAR_DATA *ch, char *argument ) { char filename[256]; char buf[MAX_INPUT_LENGTH]; CLAN_DATA *clan; char clan_filenm[MAX_INPUT_LENGTH]; int i; push_call("do_makeclan(%p,%p)",ch,argument); if (IS_NPC(ch)) { pop_call(); return; } if (argument[0] == '\0') { send_to_char( "Usage: makeclan <clan name>\n\r", ch ); pop_call(); return; } if (strlen(argument) > 10 || strlen(argument) < 3) { send_to_char( "The name of your clan must range from 3 to 10 characters.\n\r", ch); pop_call(); return; } for (i = 0 ; i < strlen(argument) ; i++) { if (argument[i] >= 'a' && argument[i] <= 'z') { continue; } if (argument[i] >= 'A' && argument[i] <= 'Z') { continue; } if (argument[i] == ' ') { continue; } send_to_char( "The name of your clan must only contain characters.\n\r", ch); pop_call(); return; } for (i = 0 ; i < strlen(argument) ; i++) { argument[i] = LOWER(argument[i]); } if ((clan = get_clan(argument)) != NULL) { send_to_char( "That clan already exist!\n\r", ch ); pop_call(); return; } if (ch->pcdata->clan != NULL) { send_to_char( "You are already in a clan!\n\r", ch ); pop_call(); return; } if (get_help(ch, argument) != NULL) { ch_printf_color(ch, "A help file with that name already exists.\n\r"); pop_call(); return; } make_helpfile(capitalize_all(argument), get_room_index(ROOM_VNUM_CLANHALLS)->area); ch->pcdata->bank -= CLANHALL_CONSTRUCTION; for (i = 0 ; i < strlen(argument) ; i++) { argument[i] = LOWER(argument[i]); } /* replace spaces by underscores from arg for clan filename 20-01-2001 - Manwe */ strcpy(clan_filenm, argument); for (i = 0 ; i < strlen(clan_filenm) ; i++) { if (clan_filenm[i] == ' ') { clan_filenm[i] = '_'; } } sprintf( filename, "%s.cln", clan_filenm); ALLOCMEM( clan, CLAN_DATA, 1); argument[0] = UPPER(argument[0]); clan->name = STRALLOC( argument); clan->motto = STRALLOC( "" ); clan->description = STRALLOC( "" ); clan->leader[0] = STRALLOC( ch->name ); clan->leader[1] = STRALLOC( "" ); clan->leader[2] = STRALLOC( "" ); clan->leader[3] = STRALLOC( "" ); clan->leader[4] = STRALLOC( "" ); clan->filename = STRALLOC( filename ); clan->email = STRALLOC( "" ); clan->home = ch->in_room->vnum; clan->founder_pvnum = ch->pcdata->pvnum; clan->members = 1; sort_clans ( clan ); ch->pcdata->clan = clan; RESTRING(ch->pcdata->clan_name, clan->name); SET_BIT(ch->in_room->room_flags, ROOM_NOTE_BOARD); save_clan( clan ); save_clan_list(); CHECK_AUTOSAVE(room_index[ROOM_VNUM_CLANHALLS]->area); sprintf(buf, "The clan of %s is formed!", clan->name); do_echo(NULL, buf); log_printf("%s created the clan %s (filename: %s)", ch->name, clan->name, clan->filename); pop_call(); return; } void destroy_clan(CLAN_DATA *deadclan) { PLAYER_GAME *fpl; ROOM_INDEX_DATA *room; CHAR_DATA *mob; HELP_DATA *help; push_call("destroy_clan(%p)", deadclan); log_printf("destroy_clan: deleting %s", deadclan->name); save_clan(deadclan); for (mob = mud->f_char ; mob ; mob = mob->next) { if (IS_NPC(mob) && mob->pIndexData->creator_pvnum == deadclan->founder_pvnum) { if (IS_SET(mob->act, ACT_IS_HEALER)) { REMOVE_BIT(mob->act, ACT_IS_HEALER); mob->pIndexData->act = mob->act; } if (IS_SET(mob->act, ACT_GUARD)) { REMOVE_BIT(mob->act, ACT_GUARD); mob->pIndexData->act = mob->act; } if (IS_SET(mob->act, ACT_TRAIN)) { REMOVE_BIT(mob->act, ACT_TRAIN); mob->pIndexData->act = mob->act; } } } for (help = room_index[ROOM_VNUM_CLANHALLS]->area->first_help ; help ; help = help->next) { if (!strcasecmp(help->keyword, deadclan->name)) { delete_help(help); break; } } for (fpl = mud->f_player ; fpl ; fpl = fpl->next) { if (fpl->ch->pcdata->clan && fpl->ch->pcdata->clan == deadclan) { fpl->ch->pcdata->clan = NULL; RESTRING(fpl->ch->pcdata->clan_name, ""); } } if ((room = get_room_index(deadclan->home)) != NULL) { REMOVE_BIT(room->room_flags, ROOM_NOTE_BOARD); } if ((room = get_room_index(deadclan->store)) != NULL) { REMOVE_BIT(room->room_flags, ROOM_CLANSTOREROOM); } UNLINK(deadclan, mud->f_clan, mud->l_clan, next, prev); STRFREE(deadclan->name); STRFREE(deadclan->motto); STRFREE(deadclan->description); STRFREE(deadclan->leader[0]); STRFREE(deadclan->leader[1]); STRFREE(deadclan->leader[2]); STRFREE(deadclan->leader[3]); STRFREE(deadclan->leader[4]); STRFREE(deadclan->filename); STRFREE(deadclan->email); FREEMEM(deadclan); save_clan_list(); CHECK_AUTOSAVE(room_index[ROOM_VNUM_CLANHALLS]->area); pop_call(); return; } void do_clanset( CHAR_DATA *ch, char *argument ) { CLAN_DATA *clan = NULL; CHAR_DATA *sch; HELP_DATA *pHelp; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; push_call("do_clanset(%p,%p)",ch,argument); if (!IS_IMMORTAL(ch) && !is_clan_leader(ch)) { send_to_char("You are not a clan leader.\n\r", ch); pop_call(); return; } CHECK_EDITMODE(ch); if (ch->desc && ch->pcdata->clan) { switch( ch->pcdata->editmode ) { case MODE_HELP_EDIT: if ((pHelp = ch->pcdata->edit_ptr) == NULL) { log_printf("do_clanset: null edit_ptr"); stop_editing( ch ); pop_call(); return; } STRFREE(pHelp->text ); pHelp->text = copy_buffer(ch); stop_editing(ch); CHECK_AUTOSAVE(room_index[ROOM_VNUM_CLANHALLS]->area); pop_call(); return; } } smash_tilde(argument); argument = one_argument_nolower(argument, arg1); if (IS_IMMORTAL(ch)) { argument = one_argument_nolower(argument, arg2); } if (arg1[0] == '\0') { if (IS_IMMORTAL(ch)) { send_to_char( "Syntax: clanset <clan> <field> <argument>\n\r", ch); send_to_char( " Field being one of:\n\r", ch ); send_to_char( " leader number1 number2 number3 number4 members home store\n\r", ch); send_to_char( " =motto help email founder guards healers\n\r", ch); send_to_char( " backdoors trainers banks morgues altars\n\r", ch); } else { send_to_char( "Syntax: clanset <motto|help|email|tax|storeroom>\n\r", ch); } pop_call(); return; } if (IS_IMMORTAL(ch)) { clan = get_clan(arg1); strcpy(arg1, arg2); } else { clan = ch->pcdata->clan; } if (!clan) { send_to_char( "No such clan.\n\r", ch ); pop_call(); return; } if (!strcasecmp(arg1, "motto")) { RESTRING(clan->motto, argument); ch_printf_color(ch, "Motto set to: {118}'%s'\n\r", clan->motto); pop_call(); return; } if (!strcasecmp(arg1, "email")) { RESTRING(clan->email, argument); ch_printf_color(ch, "Email set to: %s\n\r", clan->email); pop_call(); return; } if (!strcasecmp(arg1, "storeroom")) { if (!IS_IMMORTAL(ch)) { if (ch->in_room->creator_pvnum != ch->pcdata->pvnum) { send_to_char("You are NOT in your castle!\n\r", ch); pop_call(); return; } } if (get_room_index(clan->store) != NULL) { REMOVE_BIT(room_index[clan->store]->room_flags, ROOM_CLANSTOREROOM); } SET_BIT(ch->in_room->room_flags, ROOM_CLANSTOREROOM); clan->store = ch->in_room->vnum; send_to_char( "Storeroom set.\n\r", ch ); save_clan(clan); CHECK_AUTOSAVE(room_index[ROOM_VNUM_CLANHALLS]->area); pop_call(); return; } if (!strcasecmp(arg1, "help")) { if (ch->desc == NULL) { log_printf("clanset description: no descriptor"); pop_call(); return; } if ((pHelp = get_help(ch, clan->name)) == NULL) { send_to_char("Your clan doesn't seem to have a help file, contact the immortals.\n\r", ch); pop_call(); return; } switch( ch->pcdata->editmode ) { default: bug( "do_clanset: bad mode"); pop_call(); return; case MODE_RESTRICTED: send_to_char( "You cannot use this command from while editing something else.\n\r",ch); pop_call(); return; case MODE_NONE: ch->pcdata->edit_ptr = pHelp; ch->pcdata->editmode = MODE_HELP_EDIT; start_editing(ch, pHelp->text); pop_call(); return; } } if (!strcasecmp(arg1, "tax")) { if (atoi(argument) < 0 || atoi(argument) > 50) { ch_printf_color(ch, "Tax rate must be between 0 and 50%%.\n\r"); pop_call(); return; } clan->tax = atoi( argument ); ch_printf_color(ch, "Taxrate set to %d%%.\n\r",clan->tax); pop_call(); return; } if (!IS_IMMORTAL(ch)) { do_clanset(ch, ""); pop_call(); return; } if (!strcasecmp(arg2, "leader") || !strcasecmp(arg2, "number1") || !strcasecmp(arg2, "number2") || !strcasecmp(arg2, "number3") || !strcasecmp(arg2, "number4")) { int position; if ((sch = lookup_char(argument)) == NULL) { ch_printf_color(ch, "%s is not logged on right now.\n\r", argument); pop_call(); return; } if (!strcasecmp(arg2, "leader")) { position = 0; } else if (!strcasecmp(arg2, "number1")) { position = 1; } else if (!strcasecmp(arg2, "number2")) { position = 2; } else if (!strcasecmp(arg2, "number3")) { position = 3; } else { position = 4; } if (sch->pcdata->clan != NULL) { sch->pcdata->clan->members--; } if (is_clan_leader(sch)) { RESTRING(sch->pcdata->clan->leader[sch->pcdata->clan_position], ""); } RESTRING(sch->pcdata->clan_name, clan->name); sch->pcdata->clan = clan; clan->members++; RESTRING(clan->leader[position], sch->name); sch->pcdata->clan_position = position; ch_printf_color(ch, "%s now holds leader position %d of %s\n\r", sch->name, position, clan->name); save_char_obj( sch, NORMAL_SAVE ); save_clan(clan); pop_call(); return; } if (!strcasecmp( arg2, "members")) { clan->members = atoi( argument ); ch_printf_color(ch, "Amount of members set to: %d\n\r", clan->members); save_clan(clan); pop_call(); return; } if (!strcasecmp( arg2, "home")) { clan->home = atoi( argument ); ch_printf_color(ch, "Gohome room vnum set to: %d\n\r", clan->home); save_clan(clan); pop_call(); return; } if (!strcasecmp( arg2, "founder")) { clan->founder_pvnum = atoi( argument ); ch_printf_color(ch, "Founder pvnum set to: %d\n\r", clan->founder_pvnum); save_clan(clan); pop_call(); return; } if (!strcasecmp(arg2, "guards")) { clan->num_guards = atoi(argument); ch_printf_color(ch, "Number of guards set to: %d\n\r", clan->num_guards); save_clan(clan); pop_call(); return; } if (!strcasecmp( arg2, "healers")) { clan->num_healers = atoi(argument); ch_printf_color(ch, "Number of healers set to: %d\n\r", clan->num_healers); save_clan(clan); pop_call(); return; } if (!strcasecmp(arg2, "backdoors")) { clan->num_backdoors = atoi(argument); ch_printf_color(ch, "Number of backdoors set to: %d\n\r", clan->num_backdoors); save_clan(clan); pop_call(); return; } if (!strcasecmp(arg2, "trainers")) { clan->num_trainers = atoi(argument); ch_printf_color(ch, "Number of trainers set to: %d\n\r", clan->num_trainers); save_clan(clan); pop_call(); return; } if (!strcasecmp(arg2, "banks")) { clan->num_banks = atoi(argument); ch_printf_color(ch, "Number of banks set to: %d\n\r", clan->num_banks); save_clan(clan); pop_call(); return; } if (!strcasecmp(arg2, "morgues")) { clan->num_morgues = atoi(argument); ch_printf_color(ch, "Number of morgues set to: %d\n\r", clan->num_morgues); save_clan(clan); pop_call(); return; } if (!strcasecmp(arg2, "altars")) { clan->num_altars = atoi(argument); ch_printf_color(ch, "Number of altars set to: %d\n\r", clan->num_altars); save_clan(clan); pop_call(); return; } do_clanset( ch, "" ); pop_call(); return; } void do_donate(CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj, *pit; ROOM_INDEX_DATA *location; CHAR_DATA *rch; char buf[MAX_STRING_LENGTH]; push_call("do_donate(%p,%p)",ch,argument); if (IS_NPC(ch) || ch->pcdata->clan == NULL) { send_to_char("You are not a member of a clan.\n\r", ch); pop_call(); return; } if (in_combat(ch)) { send_to_char( "You can't donate while fighting!\n\r", ch); pop_call(); return; } if ((location = get_room_index(ch->pcdata->clan->store)) == NULL) { send_to_char("Your clan does not have a storeroom to recieve donated items.\n\r", ch); pop_call(); return; } if ((obj = get_obj_carry(ch, argument)) == NULL) { send_to_char("What would you like to donate ?\n\r", ch); pop_call(); return; } if (IS_OBJ_STAT(obj, ITEM_NODROP)) { send_to_char( "You can't seem to let go of it.\n\r", ch ); pop_call(); return; } for (pit = location->first_content ; pit ; pit = pit->next_content) { if (pit->pIndexData->creator_pvnum == ch->pcdata->clan->founder_pvnum && pit->item_type == ITEM_CONTAINER) { if (count_total_objects(pit) > 150) { ch_printf_color(ch, "Your clan's donation pit is full.\n\r"); } else { obj_from_char(obj); obj_to_obj(obj, pit); ch_printf_color(ch, "You chant the words to one of %s's rituals and watch %s slowly disappear...\n\r", ch->pcdata->clan->name, obj->short_descr); sprintf(buf, "%s slowly materializes from thin air, tumbling into %s.", obj->short_descr, pit->short_descr); for (rch = location->first_person ; rch ; rch = rch->next_in_room) { if (rch != ch && rch->position > POS_SLEEPING) { ch_printf_color(rch, "%s\n\r", capitalize(justify(buf, get_page_width(rch)))); } } } pop_call(); return; } } if (location->content_count >= MAX_OBJECTS_IN_ROOM) { ch_printf_color(ch, "Your clan's donation room is full.\n\r"); } else { obj_from_char( obj ); obj_to_room(obj, location->vnum); ch_printf_color(ch, "You chant the words to one of %s's rituals and watch the %s slowly disappear...\n\r", ch->pcdata->clan->name, obj->short_descr); sprintf(buf, "Before your very eyes, %s slowly appears.", obj->short_descr); for (rch = location->first_person ; rch ; rch = rch->next_in_room) { if (rch != ch && rch->position > POS_SLEEPING) { ch_printf_color(rch, "%s\n\r", justify(buf, get_page_width(rch))); } } } pop_call(); return; } /* ranges between 200 and 1000M - Scandum */ lg_int max_coffer( CLAN_DATA *clan ) { push_call("max_coffer(%p)",clan); pop_call(); return (URANGE(8, clan->members, 400)*25000000LL); } void do_coffer( CHAR_DATA *ch, char *argument ) { CHAR_DATA *target; CHAR_DATA *mob; char choice[MAX_STRING_LENGTH], amt[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; lg_int amount, tar_max; push_call("do_coffer(%p,%p)",ch,argument); if (IS_NPC(ch) || ch->pcdata->clan == NULL) { send_to_char("You are not part of a clan.\n\r", ch); pop_call(); return; } for (mob = ch->in_room->first_person ; mob ; mob = mob->next_in_room) { if (IS_NPC(mob) && IS_SET(mob->act, ACT_TRAIN)) { break; } } if (ch->in_room->vnum != ch->pcdata->clan->home && mob == NULL) { send_to_char("You must be in a bank or the home of your clan to access the coffers.\n\r", ch); pop_call(); return; } argument = one_argument(argument, choice); argument = one_argument(argument, amt); amount = URANGE(0, atoi(amt), ch->level*1000000); switch (*choice) { case 'd': if (amount > ch->gold) { send_to_char("You don't have that much gold.\n\r", ch); pop_call(); return; } else { if (ch->pcdata->clan->coffers >= max_coffer(ch->pcdata->clan)) { ch_printf_color(ch, "The clan coffers are full!\n\r" ); pop_call(); return; } if (ch->pcdata->clan->coffers + amount > max_coffer(ch->pcdata->clan)) { amount = max_coffer(ch->pcdata->clan) - ch->pcdata->clan->coffers; } gold_transaction(ch, 0 - amount); ch->pcdata->clan->coffers += amount; save_char_obj( ch, NORMAL_SAVE ); save_clan (ch->pcdata->clan); ch_printf_color(ch, "You deposit %s into your clan's coffers.\n\r", format_coins(amount,TRUE)); pop_call(); return; } break; case 'w': if (!is_clan_leader(ch)) { send_to_char("Only clan leaders can withdraw from the clan coffers.\n\r", ch); pop_call(); return; } if (amount > ch->pcdata->clan->coffers) { amount = ch->pcdata->clan->coffers; } gold_transaction(ch, amount); ch->pcdata->clan->coffers -= amount; save_char_obj( ch, NORMAL_SAVE ); save_clan (ch->pcdata->clan); ch_printf_color(ch, "You withdraw %s from the clan coffers.\n\r", format_coins(amount,TRUE)); break; case 'b': if (!is_clan_leader(ch)) { send_to_char("Only clan leaders can check the coffers.\n\r", ch); pop_call(); return; } else { ch_printf_color(ch, "The coffers currently hold %s.\n\r", format_coins(ch->pcdata->clan->coffers,TRUE)); } break; case 't': if (!is_clan_leader(ch)) { send_to_char("Only clan leaders can organize transfers from the coffers.\n\r", ch); pop_call(); return; } argument = one_argument(argument, arg); if (*arg == '\0') { send_to_char("You must specify a target.\n\r", ch); pop_call(); return; } if ((target = get_char_room(ch, arg)) == NULL) { send_to_char("They must be in the bank with you.\n\r", ch); pop_call(); return; } if (IS_NPC(target)) { send_to_char("Only players have accounts, silly.\n\r", ch); pop_call(); return; } if (ch->pcdata->clan->coffers < amount) { amount = ch->pcdata->clan->coffers; } tar_max = (target->level + 5 * 5) * 2000000; if (target->pcdata->bank + amount > tar_max) { amount = tar_max - target->pcdata->bank; } ch->pcdata->clan->coffers -= amount; target->pcdata->bank += amount; save_clan(ch->pcdata->clan); save_char_obj( ch, NORMAL_SAVE ); save_char_obj( target, NORMAL_SAVE ); ch_printf_color(ch, "You transfer %s into %s's account.\n\rThe coffers now hold %s.\n\r", format_coins(amount,FALSE), target->name, format_coins(ch->pcdata->clan->coffers,TRUE)); ch_printf_color(target, "%s transfers %s into your account.\n\rYour account balance is now %s.\n\r", ch->name, format_coins(amount,FALSE), format_coins(target->pcdata->bank,TRUE)); break; default: if (!is_clan_leader(ch)) { send_to_char("Usage: coffer deposit <amount>\n\r", ch); } else { send_to_char("Usage: coffer <deposit|withdraw|balance|transfer> [amount] [target]\n\r", ch); } break; } pop_call(); return; } void send_clan_message(CLAN_DATA *clan, char *message) { NOTE_DATA *pnote; FILE *fp; char buf[MAX_INPUT_LENGTH]; push_call("send_clan_message(%p,%p)",clan,message); strcpy(buf, "Immortal"); cat_sprintf(buf, " %s", clan->leader[0]); cat_sprintf(buf, " %s", clan->leader[1]); cat_sprintf(buf, " %s", clan->leader[2]); cat_sprintf(buf, " %s", clan->leader[3]); cat_sprintf(buf, " %s", clan->leader[4]); ALLOCMEM( pnote, NOTE_DATA, 1); pnote->next = NULL; pnote->sender = STRALLOC("E-Mud Messenger"); pnote->date = STRALLOC(get_time_string(mud->current_time)); pnote->time = mud->current_time; pnote->to_list = STRALLOC(buf); pnote->subject = STRALLOC("Important!"); pnote->room_vnum = clan->home; pnote->text = STRALLOC(message); pnote->topic = MAX_TOPIC -1; LINK(pnote, mud->f_note, mud->l_note, next, prev); close_reserve(); fp = my_fopen (NOTE_FILE, "a",FALSE); if (fp == NULL) { perror (NOTE_FILE); } else { fprintf (fp, "Sender %s~\nDate %s~\nTime %ld\nTo %s~\nSubject %s~\nTopic %d\nText\n%s~\nRoom %u\n\n", pnote->sender, pnote->date, pnote->time, pnote->to_list, pnote->subject, pnote->topic, fixer(pnote->text), pnote->room_vnum); fflush (fp); } my_fclose(fp); open_reserve(); pop_call(); return; } bool is_own_clanhall(CHAR_DATA *ch) { push_call("is_own_clanhall(%p)",ch); if (IS_NPC(ch)) { pop_call(); return TRUE; } if (IS_IMMORTAL(ch)) { pop_call(); return TRUE; } if (ch->pcdata->clan == NULL) { pop_call(); return FALSE; } if (ch->pcdata->clan->founder_pvnum == ch->in_room->creator_pvnum) { pop_call(); return TRUE; } else { pop_call(); return FALSE; } } bool is_in_clanhall(CHAR_DATA *ch) { CLAN_DATA *ctmp; push_call("is_in_clanhall(%p)",ch); if (!IS_SET(ch->in_room->room_flags, ROOM_CLANHALL)) { pop_call(); return FALSE; } for (ctmp = mud->f_clan ; ctmp ; ctmp = ctmp->next) { if (ctmp->founder_pvnum == ch->in_room->creator_pvnum) { pop_call(); return TRUE; } } pop_call(); return FALSE; } void do_forceren( CHAR_DATA *ch, char *argument ) { send_to_char( "If you want to forcerent, spell it out.\n\r", ch ); } void do_forcerent( CHAR_DATA *ch, char *argument ) { CLAN_DATA *clan, *next_clan; CHAR_DATA *mob; char buf[MAX_INPUT_LENGTH]; lg_int rent; push_call("do_forcerent(%p,%p)",ch,argument); CHECK_AUTOSAVE(room_index[ROOM_VNUM_CLANHALLS]->area); for (clan = mud->f_clan ; clan ; clan = next_clan) { next_clan = clan->next; rent = RENT_BASIC_CLAN_HALL; log_printf("Calculating rent for clan %s...", clan->name); rent += RENT_PER_GUARD * clan->num_guards; rent += RENT_PER_HEALER * clan->num_healers; rent += RENT_PER_TRAINER * clan->num_trainers; rent += RENT_PER_BANK * clan->num_banks; rent += RENT_PER_MORGUE * clan->num_morgues; rent += RENT_PER_ALTAR * clan->num_altars; rent += RENT_PER_BACKDOOR * clan->num_backdoors; if (clan->coffers >= rent) { clan->coffers -= rent; sprintf(buf, "{128}You paid %lld in rent. Coffers now at %lld.\n\r", rent, clan->coffers); send_clan_message(clan, buf); log_printf("Clan %s paid %lld in rent, coffers at %lld", clan->name, rent, clan->coffers); continue; } else { buf[0] = '\0'; } if (clan->num_healers > 0) { for (mob = mud->f_char ; mob ; mob = mob->next) { if (IS_NPC(mob) && mob->pIndexData->creator_pvnum == clan->founder_pvnum) { if (IS_SET(mob->act, ACT_IS_HEALER)) { REMOVE_BIT(mob->act, ACT_IS_HEALER); mob->pIndexData->act = mob->act; } } } clan->coffers += clan->num_healers * CLANHALL_FLAG / 2; clan->num_healers = 0; strcat(buf, "{128}Your clan's healers were all fired to cover costs.\n\r"); log_printf("Clan %s had their Healers fired, coffers at %lld", clan->name, clan->coffers); } if (clan->coffers >= rent) { clan->coffers -= rent; cat_sprintf(buf, "{128}You paid %lld in rent. Coffers now at %lld.\n\r", rent, clan->coffers); send_clan_message(clan, buf); log_printf("Clan %s paid %lld in rent, coffers at %lld", clan->name, rent, clan->coffers); continue; } if (clan->num_guards > 0) { for (mob = mud->f_char ; mob ; mob = mob->next) { if (IS_NPC(mob) && mob->pIndexData->creator_pvnum == clan->founder_pvnum) { if (IS_SET(mob->act, ACT_GUARD)) { REMOVE_BIT(mob->act, ACT_GUARD); mob->pIndexData->act = mob->act; } } } clan->coffers += clan->num_guards*CLANHALL_FLAG / 2; clan->num_guards = 0; strcat(buf, "{128}Your clan's guards were all fired to cover costs.\n\r"); log_printf("Clan %s had their Guards fired, coffers at %lld", clan->name, clan->coffers); } if (clan->coffers >= rent) { clan->coffers -= rent; cat_sprintf(buf, "{128}You paid %lld in rent. Coffers now at %lld.\n\r", rent, clan->coffers); send_clan_message(clan, buf); log_printf("Clan %s paid %lld in rent, coffers at %lld", clan->name, rent, clan->coffers); continue; } if (clan->num_trainers > 0) { for (mob = mud->f_char ; mob ; mob = mob->next) { if (IS_NPC(mob) && mob->pIndexData->creator_pvnum == clan->founder_pvnum) { if (IS_SET(mob->act, ACT_TRAIN)) { REMOVE_BIT(mob->act, ACT_TRAIN); mob->pIndexData->act = mob->act; } } } clan->coffers += clan->num_trainers*CLANHALL_FLAG / 2; clan->num_trainers = 0; strcat(buf, "{128}Your clan's trainers were all fired to cover costs.\n\r"); log_printf("Clan %s had their Trainers fired, coffers at %lld", clan->name, clan->coffers); } if (clan->coffers >= rent) { clan->coffers -= rent; cat_sprintf(buf, "{128}You paid %lld in rent. Coffers now at %lld.\n\r", rent, clan->coffers); send_clan_message(clan, buf); log_printf("Clan %s paid %lld in rent, coffers at %lld", clan->name, rent, clan->coffers); continue; } if (clan->coffers >= rent) { clan->coffers -= rent; cat_sprintf(buf, "{128}You paid %lld in rent. Coffers now at %lld.\n\r", rent, clan->coffers); send_clan_message(clan, buf); log_printf("Clan %s paid %lld in rent, coffers at %lld", clan->name, rent, clan->coffers); continue; } if (clan->coffers >= rent) { clan->coffers -= rent; cat_sprintf(buf, "{128}You paid %lld in rent. Coffers now at %lld.\n\r", rent, clan->coffers); send_clan_message(clan, buf); log_printf("Clan %s paid %lld in rent, coffers at %lld", clan->name, rent, clan->coffers); continue; } if (clan->coffers >= rent) { clan->coffers -= rent; cat_sprintf(buf, "{128}You paid %lld in rent. Coffers now at %lld.\n\r", rent, clan->coffers); send_clan_message(clan, buf); log_printf("Clan %s paid %lld in rent, coffers at %lld", clan->name, rent, clan->coffers); continue; } if (clan->coffers >= rent) { clan->coffers -= rent; cat_sprintf(buf, "{128}You paid %lld in rent. Coffers now at %lld.\n\r", rent, clan->coffers); send_clan_message(clan, buf); log_printf("Clan %s paid %lld in rent, coffers at %lld", clan->name, rent, clan->coffers); continue; } sprintf(buf, "Clan %s has been disbanded due to lack of adequate funding!\n\r", clan->name); do_echo(NULL, buf); save_clan(clan); destroy_clan(clan); } pop_call(); return; } void do_clan_mssg( CHAR_DATA *ch, char *argument ) { CLAN_DATA *clan = NULL; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; argument = one_argument_nolower(argument, arg1); push_call("do_send_clan_message(%p,%p)",ch,argument); if (arg1[0] == '\0') { ch_printf_color(ch, "Syntax: clanmessage <clan> <message>\n\r"); pop_call(); return; } if ((clan = get_clan(arg1)) == NULL) { ch_printf_color(ch, "%s is not a valid clan!\n\r", arg1); pop_call(); return; } if (argument[0] == '\0') { ch_printf_color(ch, "You should enter a message for %s.\n\r", arg1); pop_call(); return; } sprintf(arg2, "%s\n\r", argument); send_clan_message(clan, arg2); pop_call(); return; }