/************************************************************************** * # # # ## # # ### ## ## ### http://www.lyonesse.it * * # # # # # ## # # # # # * * # # # # # ## ## # # ## ## ## # # ## * * # # # # # ## # # # # # # # # # # # * * ### # ## # # ### ## ## ### # # #### ## Ver. 1.0 * * * * -Based on CircleMud & Smaug- Copyright (c) 2001-2002 by Mithrandir * * * * ********************************************************************** */ /************************************************************************** * File: clan.c Intended to be used with CircleMUD * * Usage: This is the code for clans * * By Mehdi Keddache (Heritsun on Eclipse of Fate eclipse.argy.com 7777) * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * * CircleMUD (C) 1993, 94 by the Trustees of the Johns Hopkins University * **************************************************************************/ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "db.h" #include "interpreter.h" #include "spells.h" #include "handler.h" #include "clan.h" extern const char *pc_class_types[]; extern const char *pc_race_types[]; /* extern functions */ void smash_tilde(char *str); void create_building( CHAR_DATA *ch, char *arg, int clan ); /* local functions */ ACMD(do_negotiate); ACMD(do_clan); ACMD(do_cset); ACMD(do_politics); char *get_diplo_name(sh_int value); bool check_membership(CHAR_DATA *vict, CLAN_DATA *pClanan); int num_of_vis_clans(void); void save_clan_table(void); void send_clan_format(CHAR_DATA *ch); void do_clan_create(CHAR_DATA *ch, char *arg); void do_clan_disband(CHAR_DATA *ch); void do_clan_revive(CHAR_DATA *ch); void do_clan_enroll(CHAR_DATA *ch, char *arg); void do_clan_expel(CHAR_DATA *ch, char *arg); void do_clan_demote(CHAR_DATA *ch, char *arg); void do_clan_promote(CHAR_DATA *ch, char *arg); void do_clan_invite(CHAR_DATA *ch, char *arg); void do_clan_bank(CHAR_DATA *ch, char *arg, int action); void do_clan_who(CHAR_DATA *ch); void do_clan_status(CHAR_DATA *ch); void do_clan_info(CHAR_DATA *ch, char *arg); void do_clan_money(CHAR_DATA *ch, char *arg, int action); void do_clan_application(CHAR_DATA *ch, char *arg); void do_clan_diplomat(CHAR_DATA *ch, char *arg); void do_clan_magistrate(CHAR_DATA *ch, char *arg); void do_clan_hero(CHAR_DATA *ch, char *arg); void do_clan_apply(CHAR_DATA *ch, char *arg); void do_clan_set(CHAR_DATA *ch, char *arg); /* global vars & structs */ int num_of_clans; CLAN_DATA *clans_table; CLAN_POLITIC_DATA politics_data; /* tables */ const char *clan_status_table[] = { "Forming", "Active", "Inactive", "Disbanding", "Dead", "\n" }; const char *clan_types_table[] = { "Normal", "Private", "Secret", "\n" }; const char *clan_anti_table[] = { "No Good", "No Neutral" "No Evil", "No Pkiller", "No Pthieves", "Only Pkiller", "Only Pthieves", "No Male", "No Female", "\n" }; const struct clan_titles clan_rank_table[] = { { {"<Invited>", "<Invited>", "<Invited>"} }, /* Invited */ { {"<Applier>", "<Applier>", "<Applier>"} }, /* Applied */ { {"<Recruit>", "<Recruit>", "<Recruit>"} }, { {"<Adept>", "<Adept>", "<Adept>"} }, { {"<Officer>", "<Officer>", "<Officer>"} }, { {"<Lieutenant>","<Lieutenant>", "<Lieutenant>"} }, { {"<Vassal>", "<Vassal>", "<Vassal>"} }, /* 6 */ /* MAX ADVANCE */ { {"<Ambassador>","<Ambassador>", "<Ambassadress>"} }, /* SPECIAL */ { {"<Magistrate>","<Magistrate>", "<Magistrate>"} }, /* SPECIAL */ { {"<Lord>", "<Lord>", "<Lady>"} }, /* SPECIAL */ { {"<Leader>", "<Leader>", "<Leader>"} }, /* 10 */ { {"<Patron>", "<Patron>", "<Patron>"} }, /* God creator */ { { NULL, NULL, NULL } } }; /* === Clan Utilities Functions =========================== */ CLAN_DATA *get_clan(int idnum) { CLAN_DATA *pClan; if (idnum == -1) return (NULL); for (pClan = clans_table; pClan; pClan = pClan->next) { if (pClan->id == idnum) break; } return (pClan); } CLAN_DATA *find_clan(char *name) { CLAN_DATA *pClan; for (pClan = clans_table; pClan; pClan = pClan->next) { if (!str_cmp(pClan->name, name)) break; } return (pClan); } /* * return the number of visible (non-secret) clans */ int num_of_vis_clans(void) { CLAN_DATA *pClan; int num = 0; for (pClan = clans_table; pClan; pClan = pClan->next) { if (!IS_SET(pClan->ctype, CLAN_SECRET)) num++; } return (num); } /* === Clan Files handling Functions =========================== */ void fwrite_clan(CLAN_DATA *pClan) { FILE *fp; char fname[128]; sprintf(fname, "%s%d.clan", LIB_CLANS, pClan->id ); if ( !(fp = fopen(fname, "w") ) ) { log( "SYSERR: unable to create clan file %s.", fname ); return; } fprintf( fp, "#CLAN\n" ); fprintf( fp, "ClanID %hd\n", pClan->id ); fprintf( fp, "Name %s~\n", pClan->name ); fprintf( fp, "Abbr %s\n", pClan->abbr ); fprintf( fp, "Leader %s\n", pClan->leader ); fprintf( fp, "Godname %s\n", pClan->godname ); if ( pClan->motto ) fprintf( fp, "Motto %s~\n", pClan->motto ); if ( pClan->warcry ) fprintf( fp, "Warcry %s~\n", pClan->warcry ); fprintf( fp, "Members %hd\n", pClan->members ); fprintf( fp, "Magistr %hd\n", pClan->magistrates ); fprintf( fp, "Ambass %hd\n", pClan->ambassadors ); fprintf( fp, "Heroes %hd\n", pClan->heroes ); fprintf( fp, "AppLevel %hd\n", pClan->app_level ); fprintf( fp, "MaxLevel %hd\n", pClan->max_level ); fprintf( fp, "Status %hd\n", pClan->status ); fprintf( fp, "ClanType %hd\n", pClan->ctype ); fprintf( fp, "AntiClass %d\n", pClan->anti_class ); fprintf( fp, "AntiOther %d\n", pClan->anti_other ); fprintf( fp, "Power %d\n", pClan->power ); fprintf( fp, "Influence %d\n", pClan->influence ); fprintf( fp, "Treasure %d\n", pClan->treasure ); fprintf( fp, "Appfee %d\n", pClan->app_fee ); fprintf( fp, "Dues %d\n", pClan->dues ); fprintf( fp, "Hall %d\n", pClan->hall ); fprintf( fp, "Birth %d\n", pClan->birth ); fprintf( fp, "Obj %d %d %d\n", pClan->objs[0], pClan->objs[1], pClan->objs[2] ); fprintf( fp, "End\n" ); fclose(fp); } /* Save clan structure to disk */ void save_clans() { CLAN_DATA *pClan; log( "Saving clans" ); for (pClan = clans_table; pClan; pClan = pClan->next) fwrite_clan(pClan); } /* * Save clan politics structure to disk */ void save_clan_table(void) { FILE *fl; if (!(fl = fopen(CLAN_DIP_FILE, "wb"))) { log("SYSERR: Unable to open clandata file"); return; } fwrite(&politics_data, sizeof(CLAN_POLITIC_DATA), 1, fl); fclose(fl); } #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !strcmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } CLAN_DATA *fread_clan(FILE *fp) { CLAN_DATA *pClan; char *word; bool fMatch; CREATE(pClan, CLAN_DATA, 1); pClan->name = NULL; pClan->abbr = NULL; pClan->leader = NULL; pClan->godname = NULL; pClan->motto = NULL; pClan->warcry = NULL; for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch (UPPER(word[0])) { case '*': case '#': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY("Abbr", pClan->abbr, str_dup(fread_word(fp))); KEY("Ambass", pClan->ambassadors, fread_number(fp)); KEY("AntiClass", pClan->anti_class, fread_number(fp)); KEY("AntiOther", pClan->anti_other, fread_number(fp)); KEY("AppLevel", pClan->app_level, fread_number(fp)); KEY("Appfee", pClan->app_fee, fread_number(fp)); break; case 'B': KEY("Birth", pClan->birth, fread_number(fp)); break; case 'C': KEY("ClanID", pClan->id, fread_number(fp)); KEY("ClanType", pClan->ctype, fread_number(fp)); break; case 'D': KEY("Dues", pClan->dues, fread_number(fp)); break; case 'E': if (!strcmp(word, "End")) return (pClan); break; case 'G': KEY("Godname", pClan->godname, str_dup(fread_word(fp))); break; case 'H': KEY("Hall", pClan->hall, fread_number(fp)); KEY("Heroes", pClan->heroes, fread_number(fp)); break; case 'I': KEY("Influence", pClan->influence, fread_number(fp)); break; case 'L': KEY("Leader", pClan->leader, str_dup(fread_word(fp))); break; case 'M': KEY("Magistr", pClan->magistrates, fread_number(fp)); KEY("MaxLevel", pClan->max_level, fread_number(fp)); KEY("Members", pClan->members, fread_number(fp)); KEY("Motto", pClan->motto, fread_string_nospace(fp)); break; case 'N': KEY("Name", pClan->name, fread_string_nospace(fp)); break; case 'O': if (!strcmp(word, "Obj")) { pClan->objs[0] = fread_number(fp); pClan->objs[1] = fread_number(fp); pClan->objs[2] = fread_number(fp); fMatch = TRUE; break; } break; case 'P': KEY("Power", pClan->power, fread_number(fp)); break; case 'S': KEY("Status", pClan->status, fread_number(fp)); break; case 'T': KEY("Treasure", pClan->treasure, fread_number(fp)); break; case 'W': KEY("Warcry", pClan->warcry, fread_string_nospace(fp)); break; } if (!fMatch) log("fread_clan: clan file has no match: %s", word); } } /* * Boot up initialization of clan & clan politics structure */ void init_clans(void) { FILE *fp; CLAN_DATA *pClan; char fname[128]; int i = 0; num_of_clans = 0; clans_table = NULL; for (i = 1; i < MAX_CLANS; i++) { sprintf(fname, "%s%d.clan", LIB_CLANS, i); if ((fp = fopen(fname, "r"))) { pClan = fread_clan(fp); fclose(fp); if (!pClan) { log("SYSERR: init_clans() - error reading clan %d.", i); continue; } num_of_clans++; // add to the list pClan->next = clans_table; clans_table = pClan; } } log(" %d clans loaded.", num_of_clans); if (!(fp = fopen(CLAN_DIP_FILE, "rb"))) { log(" Clandata file does not exist. Will create a new one"); save_clan_table(); return; } fread(&politics_data, sizeof(CLAN_POLITIC_DATA), 1, fp); fclose(fp); log( " politic data for clans loaded." ); log( "Clans -- DONE"); } /* * Check clan requisite for new members allowance */ bool check_membership(CHAR_DATA *vict, CLAN_DATA *pClan ) { /* ANTI_CLASS check */ if (pClan->anti_class) { if ((IS_SET(pClan->anti_class, CLAN_ANTI_MAGE) && GET_CLASS(vict) == CLASS_MAGIC_USER) || (IS_SET(pClan->anti_class, CLAN_ANTI_CLERIC) && GET_CLASS(vict) == CLASS_CLERIC) || (IS_SET(pClan->anti_class, CLAN_ANTI_THIEF) && GET_CLASS(vict) == CLASS_THIEF) || (IS_SET(pClan->anti_class, CLAN_ANTI_SORCERER) && GET_CLASS(vict) == CLASS_SORCERER) || (IS_SET(pClan->anti_class, CLAN_ANTI_WARRIOR) && GET_CLASS(vict) == CLASS_WARRIOR)) return (FALSE); } /* ANTI_RACE check */ if (pClan->anti_race) { if ((IS_SET(pClan->anti_race, CLAN_ANTI_HUMAN) && GET_RACE(vict) == RACE_HUMAN) || (IS_SET(pClan->anti_race, CLAN_ANTI_ELF) && GET_RACE(vict) == RACE_ELF) || (IS_SET(pClan->anti_race, CLAN_ANTI_DWARF) && GET_RACE(vict) == RACE_DWARF)) return (FALSE); } /* ANTI_OTHER check */ if (pClan->anti_other) { if ((IS_SET(pClan->anti_other, CLAN_ANTI_GOOD) && IS_GOOD(vict)) || (IS_SET(pClan->anti_other, CLAN_ANTI_NEUTRAL) && IS_NEUTRAL(vict)) || (IS_SET(pClan->anti_other, CLAN_ANTI_EVIL) && IS_EVIL(vict)) || (IS_SET(pClan->anti_other, CLAN_ANTI_MALE) && GET_SEX(vict) == SEX_MALE) || (IS_SET(pClan->anti_other, CLAN_ANTI_FEMALE) && GET_SEX(vict) == SEX_FEMALE)) return (FALSE); } /* aggiungere check x PK, PT */ return (TRUE); } /* === Clan User Functions =========================================== */ void send_clan_format(CHAR_DATA *ch) { send_to_char("Clan commands available to you:\n\r" " clan info <clan>\r\n",ch); if (GET_LEVEL(ch) >= LVL_CLAN_GOD) { send_to_char( " clan create <leader> <clan type> <clan abbrev> 'clan name'\r\n" " clan disband\r\n" " clan enroll <player>\r\n" " clan expel <player>\r\n" " clan promote <player>\r\n" " clan demote <player>\r\n" " clan invite <player>\r\n" " clan diplomat <player>\r\n" " clan magistrate <player>\r\n" " clan hero <player>\r\n" " clan withdraw <amount>\r\n" " clan deposit <amount>\r\n" " clan set appfee <amount>\r\n" " clan set dues <amount>\r\n" " clan set applev <level>\r\n", ch); } else { if (GET_CLAN(ch) == -1) send_to_char(" clan apply <clan>\r\n",ch); else if (GET_CLAN_RANK(ch) <= RANK_APPLIER) return; else { int r = GET_CLAN_RANK(ch); send_to_char(" clan deposit <amount>\r\n",ch); send_to_char(" clan who\r\n",ch); send_to_char(" clan status\r\n",ch); if (r <= MAX_RANK_ADVANCE) send_to_char(" clan resign\r\n", ch); if (r >= RANK_PRIVILEGES) { send_to_char(" clan withdraw <amount>\r\n", ch); send_to_char(" clan enroll <player>\r\n", ch); send_to_char(" clan expel <player>\r\n", ch); send_to_char(" clan promote <player>\r\n", ch); send_to_char(" clan demote <player>\r\n", ch); send_to_char(" clan invite <player>\r\n", ch); send_to_char(" clan set applev <level>\r\n", ch); send_to_char(" clan set appfee <amount>\r\n", ch); send_to_char(" clan set dues <amount>\r\n", ch); send_to_char(" clan diplomat <player>\r\n", ch); send_to_char(" clan magistrate <player>\r\n", ch); send_to_char(" clan hero <player>\r\n", ch); } } } } /* create a new clan */ void do_clan_create(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan, *pCl; CHAR_DATA *leader = NULL; char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH], arg3[MAX_INPUT_LENGTH]; char *clanname; int i; if (!*arg) { send_to_char("clan create <leader> <clan type> <clan abbrev> 'clan name'\r\n", ch); return; } if (GET_LEVEL(ch) < LVL_CLAN_GOD) { send_to_char("You are not mighty enough to create new clans!\r\n", ch); return; } if (GET_CLAN(ch) != -1 && GET_LEVEL(ch) < LVL_GRGOD) { send_to_char("You already are a clan patron.\r\n", ch); return; } if (num_of_clans >= MAX_CLANS - 1) { send_to_char("Max clans reached. WOW!\r\n",ch); return; } arg = two_arguments(arg, arg1, arg2); arg = one_argument(arg, arg3); clanname = get_spell_name(arg); if (clanname == NULL) { send_to_char("You need to specify a clan name.\r\n", ch); return; } if (!(*arg2)) { send_to_char("You need to specify the type of the clan, <normal/private/secret>.\r\n", ch); return; } if (!(*arg3)) { send_to_char("You need to specify a clan abbreviation of 5 characters.\r\n", ch); return; } if (!(leader = get_char_vis(ch, arg1, NULL, FIND_CHAR_ROOM))) { send_to_char("The leader of the new clan must be present.\r\n",ch); return; } if (strlen(arg3) > 5) { send_to_char("Clan abbreviation too long! (5 characters max)\r\n", ch); return; } if (strlen(clanname) > CLAN_NAME_L) { ch_printf(ch, "Clan name too long! (%d characters max)\r\n", CLAN_NAME_L); return; } if (GET_LEVEL(leader) >= LVL_IMMORT) { send_to_char("You cannot set an immortal as the leader of a clan.\r\n",ch); return; } if (GET_LEVEL(leader) < DEFAULT_APP_LVL) { ch_printf(ch, "%s is not mighty enough to be a clan leader.\r\n", GET_NAME(leader)); return; } if (GET_CLAN(leader) != -1) { send_to_char("The leader already belongs to a clan!\r\n",ch); return; } if ( find_clan(clanname) ) { send_to_char("That clan name alread exists!\r\n",ch); return; } CREATE(pClan, CLAN_DATA, 1); pClan->id = num_of_clans; pClan->abbr = str_dup( CAP((char *)arg3) ); pClan->name = str_dup( CAP((char *)clanname) ); pClan->leader = str_dup( GET_NAME(leader) ); pClan->godname = str_dup( GET_NAME(ch) ); pClan->motto = str_dup( "Long life to the clan!" ); pClan->warcry = str_dup( "For the glory of the clan!" ); pClan->birth = time(0); pClan->members = 1; pClan->ambassadors = 0; pClan->heroes = 0; pClan->magistrates = 0; pClan->power = GET_LEVEL(leader) * 2; pClan->influence = GET_LEVEL(leader); pClan->treasure = 0; pClan->hall = NOWHERE; pClan->app_fee = 0; pClan->dues = 0; pClan->app_level = DEFAULT_APP_LVL; pClan->max_level = LVL_IMMORT - 1; pClan->anti_class = 0; pClan->anti_other = 0; pClan->anti_race = 0; for (i = 0; i < MAX_CLAN_OBJ; i++) pClan->objs[i] = NOTHING; SET_BIT(pClan->status, CLAN_FORMING); if (is_abbrev(arg2, "private")) SET_BIT(pClan->ctype, CLAN_PRIVATE); else if (is_abbrev(arg2, "secret")) SET_BIT(pClan->ctype, CLAN_SECRET); else SET_BIT(pClan->ctype, CLAN_NORMAL); /* set up politics */ for (pCl = clans_table; pCl; pCl = pCl->next) { politics_data.diplomacy[pClan->id][pCl->id] = 100; politics_data.diplomacy[pCl->id][pClan->id] = 100; } /* save the new clan */ fwrite_clan(pClan); /* setup the clan god */ if (GET_LEVEL(ch) < LVL_GRGOD) { GET_CLAN(ch) = pClan->id; GET_CLAN_RANK(ch) = RANK_PATRON; } send_to_char("Clan created.\r\n", ch); GET_CLAN(leader) = pClan->id; GET_CLAN_RANK(leader) = RANK_LEADER; save_char(leader, NULL); ch_printf(leader, "You are now the leader of the newly created '%s' clan.\r\n", pClan->name); /* add to the list */ pClan->next = clans_table; clans_table = pClan; num_of_clans++; log("CLAN: new clan, '%s', created by %s.", pClan->name, GET_NAME(ch)); } /* * functions to disband and revive a clan (Only PATRON) * */ void do_clan_disband(CHAR_DATA *ch) { CLAN_DATA *pClan; if (!(pClan = get_clan(GET_CLAN(ch)))) { send_to_char("Problems with your clan... \r\n", ch); return; } if (IS_SET(pClan->status, CLAN_DISBANDING)) { send_to_char("Your clan is already in the disbandig status.\r\n", ch); return; } SET_BIT(pClan->status, CLAN_DISBANDING); send_to_char("You have initiated the disband of your clan.\r\n", ch); log("CLAN: Clan %s (%d) set to disbanding status.", pClan->name, pClan->id); fwrite_clan( pClan ); } void do_clan_revive(CHAR_DATA *ch) { CLAN_DATA *pClan; if (!(pClan = get_clan(GET_CLAN(ch)))) { send_to_char("Problems with your clan... \r\n", ch); return; } if (!IS_SET(pClan->status, CLAN_DISBANDING)) { send_to_char("Your clan is alive.\r\n", ch); return; } REMOVE_BIT(pClan->status, CLAN_DISBANDING); send_to_char("You have revived your clan form disbanding.\r\n", ch); log("CLAN: Clan %s (%d) revived from disbanding status.", pClan->name, pClan->id); fwrite_clan( pClan ); } /* ---------------------------------------------------------------------- * * Funzioni per arruolare, invitare, promuovere, retrocedere e cacciare * * pg dal clan * * ---------------------------------------------------------------------- */ /* * Enroll characters that have applied to the clan */ void do_clan_enroll(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan; CHAR_DATA *vict = NULL; int immcom = 0; if (!(*arg)) { send_clan_format(ch); return; } if (GET_LEVEL(vict) >= LVL_IMMORT) { send_to_char("You cannot enroll immortals in clans.\r\n",ch); return; } pClan = get_clan(GET_CLAN(ch)); if (!(vict = get_char_room_vis(ch, arg, NULL))) { send_to_char("Er, Who ??\r\n",ch); return; } if (GET_CLAN(vict) != GET_CLAN(ch)) { send_to_char("They didn't request to join your clan.\r\n",ch); return; } if (GET_CLAN_RANK(vict) != RANK_APPLIER) { act("$N has not applied for membership.", FALSE, ch, NULL, vict, TO_CHAR); return; } if (GET_LEVEL(vict) < pClan->app_level) { act("$N doesn't have enough experience to be a member of your clan.", FALSE, ch, NULL, vict, TO_CHAR); return; } if (GET_LEVEL(vict) > pClan->max_level) { act("$N is too powerful to be a member of your clan.", FALSE, ch, NULL, vict, TO_CHAR); return; } if (!check_membership(vict, pClan)) { act("Sorry, but $N cannot be a member of the clan.", FALSE, ch, NULL, vict, TO_CHAR); return; } /* all right, now enroll him/her */ GET_CLAN_RANK(vict) = RANK_MEMBER_FIRST; save_char(vict, NULL); pClan->power += GET_LEVEL(vict); pClan->members++; if ( pClan->members >= MIN_CLAN_MEMBERS && IS_SET(pClan->status, CLAN_FORMING) ) { REMOVE_BIT(pClan->status, CLAN_FORMING); SET_BIT(pClan->status, CLAN_ACTIVE); send_to_char("Your clan has reached the minimum number of members allowed.\r\n" "From now the clan can act as normal.\r\n", ch); log( " '%s' (%d) clan is now active.", pClan->name, pClan->id ); } if ( pClan->members == MAX_CLAN_MEMBERS ) { REMOVE_BIT(pClan->status, CLAN_ACTIVE); SET_BIT(pClan->status, CLAN_INACTIVE); send_to_char("Your clan has reached the maximum number of members allowed.\r\n", ch); } sprintf(buf, "You've been enrolled in '%s' clan!\r\n", pClan->name ); send_to_char(buf, vict); send_to_char("Done.\r\n", ch); } /* * Kick off from the clan unwanted members */ void do_clan_expel(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan; CHAR_DATA *vict = NULL; int immcom = 0; if (!(*arg)) { send_clan_format(ch); return; } pClan = get_clan( GET_CLAN(ch) ); if (!(vict = get_char_room_vis(ch, arg, NULL))) { send_to_char("Er, Who ??\r\n", ch); return; } if (GET_CLAN(vict) != pClan->id) { send_to_char("They're not in your clan.\r\n",ch); return; } if (GET_CLAN_RANK(vict) >= GET_CLAN_RANK(ch)) { send_to_char("You cannot kick out that person.\r\n",ch); return; } GET_CLAN(vict) = -1; GET_CLAN_RANK(vict) = -1; save_char(vict, NULL); pClan->power -= GET_LEVEL(vict); pClan->members--; if (pClan->members < MIN_CLAN_MEMBERS) { REMOVE_BIT(pClan->status, CLAN_ACTIVE); SET_BIT(pClan->status, CLAN_FORMING); } if (IS_SET(pClan->status, CLAN_INACTIVE)) { REMOVE_BIT(pClan->status, CLAN_INACTIVE); SET_BIT(pClan->status, CLAN_ACTIVE); } send_to_char("You've been kicked out of your clan!\r\n", vict); send_to_char("Done.\r\n", ch); } /* * Demote a clannie */ void do_clan_demote(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan; CHAR_DATA *vict = NULL; int immcom = 0; if (!(*arg)) { send_clan_format(ch); return; } pClan = get_clan(GET_CLAN(ch)); if (!(vict = get_char_room_vis(ch, arg, NULL))) { send_to_char("Er, Who ??\r\n", ch); return; } if (GET_CLAN(vict) != pClan->id) { send_to_char("They're not in your clan.\r\n", ch); return; } if (GET_CLAN_RANK(vict) == 0 || GET_CLAN_RANK(vict) == RANK_INVITED) { send_to_char("They're not enrolled yet.\r\n", ch); return; } if (GET_CLAN_RANK(vict) == RANK_MEMBER_FIRST) { send_to_char("They can't be demoted any further, use expel now.\r\n", ch); return; } if (GET_CLAN_RANK(vict) >= GET_CLAN_RANK(ch)) { send_to_char("You cannot demote a person of this rank!\r\n", ch); return; } /* hanlde those special ranks above 6 */ if (GET_CLAN_RANK(vict) > MAX_RANK_ADVANCE) { if (GET_CLAN_RANK(vict) == RANK_HERO) pClan->heroes--; else if (GET_CLAN_RANK(vict) == RANK_MAGISTRATE) pClan->magistrates--; else if (GET_CLAN_RANK(vict) == RANK_DIPLOMAT) pClan->ambassadors--; else { send_to_char("Leader or Patrone cannot be demoted.\r\n", ch); return; } GET_CLAN_RANK(vict) = MAX_RANK_ADVANCE; } else GET_CLAN_RANK(vict)--; save_char(vict, NULL); send_to_char("You've demoted within your clan!\r\n", vict); send_to_char("Done.\r\n", ch); } /* * Promote a clannie */ void do_clan_promote(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan; CHAR_DATA *vict = NULL; if (!(*arg)) { send_clan_format(ch); return; } pClan = get_clan(GET_CLAN(ch)); if (!(vict = get_char_room_vis(ch, arg, NULL))) { send_to_char("Er, Who ??\r\n", ch); return; } if (GET_CLAN(vict) != pClan->id) { send_to_char("They're not in your clan.\r\n", ch); return; } if (GET_CLAN_RANK(vict) == 0 || GET_CLAN_RANK(vict) == RANK_INVITED) { send_to_char("They're not enrolled yet.\r\n", ch); return; } if (GET_CLAN_RANK(vict) >= GET_CLAN_RANK(ch)) { send_to_char("You cannot promote that person over your rank!\r\n",ch); return; } if (GET_CLAN_RANK(vict) == MAX_RANK_ADVANCE) { send_to_char("You cannot promote someone over the top reachable rank!\r\n",ch); return; } GET_CLAN_RANK(vict)++; save_char(vict, NULL); send_to_char("You've been promoted within your clan!\r\n", vict); send_to_char("Done.\r\n", ch); } /* * Invite someone in your clan */ void do_clan_invite(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan; CHAR_DATA *vict = NULL; if (!(*arg)) { send_clan_format(ch); return; } pClan = get_clan(GET_CLAN(ch)); if (!(vict = get_char_room_vis(ch, arg, NULL))) { send_to_char("Er, Who ??\r\n", ch); return; } if (GET_CLAN(vict) > 0) { sprintf(buf, "%s already belongs to a clan.\r\n", GET_NAME(vict)); send_to_char(buf, ch); return; } if (!check_membership(vict, pClan)) { sprintf(buf, "Sorry, but %s cannot be a member of your clan.\r\n", GET_NAME(vict)); send_to_char(buf, ch); return; } GET_CLAN(vict) = GET_CLAN(ch); GET_CLAN_RANK(vict) = RANK_INVITED; save_char(vict, NULL); sprintf(buf, "You've been invited by %s to apply to '%s' clan!\r\n", GET_NAME(ch), pClan->name); send_to_char(buf, vict); send_to_char("Done.\r\n", ch); } /* * build a building for the clan */ void do_clan_build(CHAR_DATA *ch, char *arg) { if ( !*arg ) { send_to_char("What do you want to build for your clan?\r\n", ch); return; } create_building(ch, arg, GET_CLAN(ch)); } /* ---------------------------------------------------------------------- */ /* * Handling money of the clan */ void do_clan_bank(CHAR_DATA *ch, char *arg, int action) { CLAN_DATA *pClan; int amount = 0; if (!(*arg)) { send_clan_format(ch); return; } if (GET_CLAN_RANK(ch) < RANK_PRIVILEGES || GET_CLAN_RANK(ch) > RANK_PATRON) { if (action == CB_WITHDRAW) { send_to_char("You're not influent enough in the clan to do that!\r\n",ch); return; } } pClan = get_clan(GET_CLAN(ch)); if (!(*arg)) { if ( action == CB_DEPOSIT ) send_to_char("How many coins would you deposit?\r\n",ch); else send_to_char("How many coins would you withdraw?\r\n",ch); return; } if (!is_number(arg)) { send_to_char("That's not a monetary amount!\r\n",ch); return; } amount = atoi(arg); if (action == CB_DEPOSIT && get_gold(ch) < amount) { send_to_char("You do not have that kind of money!\r\n", ch); return; } if (action == CB_WITHDRAW && pClan->treasure < amount) { send_to_char("The clan is not wealthy enough for your needs!\r\n", ch); return; } switch (action) { case CB_WITHDRAW: create_amount(amount, ch, NULL, NULL, NULL, FALSE); pClan->treasure -= amount; send_to_char("You withdraw from the clan's treasure.\r\n", ch); break; case CB_DEPOSIT: sub_gold(ch, amount); pClan->treasure += amount; send_to_char("You add to the clan's treasure.\r\n", ch); break; default: send_to_char("Problem in command, please report.\r\n", ch); break; } save_char(ch, NULL); fwrite_clan(pClan); } /* ---------------------------------------------------------------------- */ /* * Which members of the clan are playing? */ void do_clan_who(CHAR_DATA *ch) { DESCRIPTOR_DATA *d; CHAR_DATA *tch; char line_disp[MAX_STRING_LENGTH]; if (GET_CLAN_RANK(ch) == 0 || GET_CLAN_RANK(ch) == RANK_INVITED) { send_to_char("You are not been accepted by your clan, yet.\r\n", ch); return; } send_to_char("\r\nList of your clan members\r\n", ch); send_to_char("-------------------------\r\n", ch); for (d = descriptor_list; d; d = d->next) { if (d->connected) continue; if ((tch = d->character)) { if (GET_CLAN(tch) == GET_CLAN(ch) && GET_CLAN_RANK(tch) > 0) { sprintf(line_disp,"(%20s) %s\r\n", GET_RANK_NAME(tch), GET_NAME(tch)); send_to_char(line_disp,ch); } } } } /* * clannie's status */ void do_clan_status(CHAR_DATA *ch) { CLAN_DATA *pClan; char line_disp[MAX_STRING_LENGTH]; if (IS_IMMORTAL(ch)) { send_to_char("You are an immortal and cannot join any clan!\r\n", ch); return; } pClan = get_clan(GET_CLAN(ch)); if (GET_CLAN_RANK(ch) == 0) sprintf(line_disp, "You applied to '%s'\r\n", pClan->name); else if (GET_CLAN_RANK(ch) == RANK_INVITED) sprintf(line_disp, "You have been invited to apply to '%s'\r\n", pClan->name); else sprintf(line_disp, "You are %s (Rank %d) of '%s' (ID %d)\r\n", GET_RANK_NAME(ch), GET_CLAN_RANK(ch), pClan->name, pClan->id); send_to_char(line_disp, ch); } /* * List of clans (no args) or detailed infos about the clan */ void do_clan_info(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan; int i = 0; char buf9[10]; char ctypes[128], cstat[128], cant1[128], cant2[128], cant3[128]; if (num_of_clans == 0) { send_to_char("No clans have formed yet.\r\n",ch); return; } strcpy(buf, "Clan list:\r\n"); if (!(*arg)) { for (pClan = clans_table; pClan; pClan = pClan->next) { strcpy(buf9, " "); if (IS_SET(pClan->ctype, CLAN_SECRET)) { if (GET_LEVEL(ch) < LVL_GRGOD && GET_CLAN(ch) != pClan->id) continue; else strcpy(buf9, "(S)"); } if (IS_SET(pClan->ctype, CLAN_PRIVATE)) strcpy(buf9, "(P)"); sprintf(buf + strlen(buf), "[%-2d] %s %-35s %-5s Members: %3d Power: %5d Appfee: %d\r\n", pClan->id, buf9, pClan->name, pClan->abbr, pClan->members, pClan->power, pClan->app_fee); } page_string(ch->desc,buf, 1); return; } else { if ( !(pClan = find_clan(arg) ) ) { send_to_char("Unknown clan.\r\n", ch); return; } } if (IS_SET(pClan->ctype, CLAN_SECRET) && GET_LEVEL(ch) < LVL_GRGOD && GET_CLAN(ch) != pClan->id ) { send_to_char("Unknown Clan.\r\n", ch); return; } if ( pClan->ctype ) sprintbit( pClan->ctype, clan_types_table, ctypes ); else strcpy( ctypes, "None"); if ( pClan->status ) sprintbit( pClan->status, clan_status_table, cstat ); else strcpy( cstat, "None"); if ( pClan->anti_class ) sprintbit( pClan->anti_class, pc_class_types, cant1 ); else strcpy( cant1, "None"); if ( pClan->anti_race ) sprintbit( pClan->anti_race, pc_race_types, cant2 ); else strcpy( cant2, "None"); if ( pClan->anti_other ) sprintbit( pClan->anti_other, clan_anti_table, cant3 ); else strcpy( cant3, "None"); sprintf(buf, "\r\n&b&7Info for clan&0 <<&b&3%s&0>>:\r\n\r\n" "Abbreviation : %s\r\n" "Leader : %s\r\n" "Members : %d\r\n" "Power : %d\r\n" "Treasure : %d\r\n" "Application fee : %d gold coins\r\n" "Monthly Dues : %d gold coins\r\n" "Application level : %d\r\n" "Max level : %d\r\n" "Clan Type : %s\r\n" "Clan Status : %s\r\n" "Class restrictions : %s\r\n" "Race restrictions : %s\r\n" "Other restrictions : %s\r\n", pClan->name, pClan->abbr, pClan->leader, pClan->members, pClan->power, pClan->treasure, pClan->app_fee, pClan->dues, pClan->app_level, pClan->max_level, ctypes, cstat, cant1, cant2, cant3 ); send_to_char(buf, ch); } /* ---------------------------------------------------------------------- */ /* Funzioni chiamate da Set */ /* ---------------------------------------------------------------------- */ /* * Set the application fee and the monthly dues */ void do_clan_money(CHAR_DATA *ch, char *arg, int action) { CLAN_DATA *pClan; int amount = 0; if (!(*arg)) { send_clan_format(ch); return; } pClan = get_clan(GET_CLAN(ch)); if (!(*arg)) { send_to_char("Set it to how much?\r\n", ch); return; } if (!is_number(arg)) { send_to_char("Set it to what?\r\n", ch); return; } amount = atoi(arg); switch (action) { case CM_APPFEE: pClan->app_fee = amount; send_to_char("You change the application fee.\r\n", ch); break; case CM_DUES: pClan->dues = amount; send_to_char("You change the monthly dues.\r\n", ch); break; default: send_to_char("Problem in command, please report.\r\n", ch); break; } fwrite_clan( pClan ); } /* * Set the minimum application level to the clan */ void do_clan_application(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan; int applevel; if (!(*arg)) { send_clan_format(ch); return; } pClan = get_clan(GET_CLAN(ch)); if (!(*arg)) { send_to_char("Set to which level?\r\n", ch); return; } if (!is_number(arg)) { send_to_char("Set the application level to what?\r\n", ch); return; } applevel = atoi(arg); if (applevel < 2 || applevel > (LVL_IMMORT - 1)) { sprintf(buf, "The application level can go from 2 to %d.\r\n", (LVL_IMMORT - 1)); send_to_char(buf, ch); return; } pClan->app_level = applevel; fwrite_clan( pClan ); } /* * Nomina ad uno dei rank speciali: * * - diplomatico (gestisce le relazioni con altri clan) * - magistrato (amministratore del clan) * - eroe (comandante in guerra) */ void do_clan_specialrank(CHAR_DATA *ch, char *rank, char *arg) { CLAN_DATA *pClan; CHAR_DATA *vict = NULL; if (!(*arg)) { send_clan_format(ch); return; } pClan = get_clan(GET_CLAN(ch)); if (!(vict = get_char_room_vis(ch, arg, NULL))) { send_to_char("Er, Who ??\r\n", ch); return; } if (GET_CLAN(vict) != pClan->id) { send_to_char("They're not in your clan.\r\n", ch); return; } if (GET_CLAN_RANK(vict) < RANK_MEMBER_FIRST) { send_to_char("They're not enrolled yet.\r\n", ch); return; } if ( !isname( rank, "diplomat magistrate hero" ) ) { log( "SYSERR: clan_specialrank() : unknown special rank %s", rank ); sprintf( buf, "%s: Rango sconosciuto.\r\n", rank ); } else { if ( isname( rank, "diplomat") ) { GET_CLAN_RANK(vict) = RANK_DIPLOMAT; pClan->ambassadors++; sprintf(buf, "%s is now a diplomat of your clan.\r\n", GET_NAME(vict)); send_to_char("Now you are a diplomat of your clan.\r\n", vict); } else if ( isname( rank, "magistrate" ) ) { GET_CLAN_RANK(vict) = RANK_MAGISTRATE; pClan->magistrates++; sprintf(buf, "%s is now a magistrate of your clan.\r\n", GET_NAME(vict)); send_to_char("Now you are a magistrate of your clan.\r\n", vict); } else if ( isname( rank, "hero" ) ) { GET_CLAN_RANK(vict) = RANK_HERO; pClan->heroes++; sprintf(buf, "%s is now a hero of your clan.\r\n", GET_NAME(vict)); send_to_char("Now you are a hero of your clan.\r\n", vict); } save_char(vict, NULL); fwrite_clan( pClan ); } send_to_char(buf, ch); } /* * solo per diplomatici */ ACMD(do_negotiate) { CLAN_DATA *chclan, *tclan; char buf[MAX_STRING_LENGTH]; char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; sh_int target_clan; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); if (IS_NPC(ch) || GET_CLAN_RANK(ch) != RANK_DIPLOMAT) { send_to_char( "This command is for clan diplomats only.\r\n", ch ); return; } if (!is_number(arg1) || !(*arg2)) { send_to_char( "Syntax: Negotiate <clan number> <peace/war/end>\r\n", ch ); return; } target_clan = atoi(arg1); if ((target_clan < 1) || (target_clan > (MAX_CLANS - 1))) { send_to_char("That is not a clan!\r\n", ch); return; } if (target_clan == GET_CLAN(ch)) { send_to_char("Well, that will accomplish a lot.. you must be of two minds about the whole thing!\r\n", ch ); return; } if ( !(tclan = get_clan(target_clan) ) ) { send_to_char("That clan does not exist!\r\n", ch); return; } if (IS_SET(tclan->ctype, CLAN_SECRET)) { send_to_char("That clan does not exist!\r\n", ch); return; } chclan = get_clan(GET_CLAN(ch)); if (IS_SET(chclan->ctype, CLAN_SECRET)) { send_to_char("Yours is a secret clan! You have no needs of negotiations.\r\n", ch); return; } if (politics_data.daily_negotiate_table[chclan->id][tclan->id]) { sprintf(buf, "Your clan has already negotiated with %s today.\r\n", tclan->name); send_to_char(buf, ch); return; } /* P E A C E */ if (!str_cmp(arg2, "peace")) { if (politics_data.diplomacy[chclan->id][tclan->id] < -450) { if (politics_data.end_current_state[chclan->id][tclan->id] && politics_data.end_current_state[tclan->id][chclan->id]) { politics_data.diplomacy[chclan->id][tclan->id] = -425; politics_data.diplomacy[tclan->id][chclan->id] = -425; send_to_char("You have successfully negotiated an end to this dreaded CLAN WAR. Great Job!!\r\n", ch); sprintf(buf, "CLAN: The war between %s and %s has ended. They may no longer PKILL each other!!\r\n", chclan->name, tclan->name); send_to_all(buf); politics_data.end_current_state[chclan->id][tclan->id] = FALSE; politics_data.end_current_state[tclan->id][chclan->id] = FALSE; } else { sprintf(buf, "You are currently at WAR with %s." "Both clans must negotiate an end to the war first.\r\n", tclan->name); send_to_char(buf, ch); return; } } else { politics_data.diplomacy[chclan->id][tclan->id] += 25; politics_data.diplomacy[tclan->id][chclan->id] += 25; sprintf(buf, "You are requesting a more peaceful state of affairs with %s.\r\n", tclan->name ); send_to_char(buf, ch); } } /* W A R */ else if (!str_cmp(arg2, "war")) { if ((politics_data.diplomacy[chclan->id][tclan->id] - 50) < -450) { sprintf(buf, "You have started a WAR with %s! Watch out!.\r\n", tclan->name); send_to_char(buf, ch); sprintf(buf, "CLAN: A war has started between %s and %s. They may now PKILL each other!!\r\n", chclan->name, tclan->name); send_to_all(buf); politics_data.diplomacy[chclan->id][tclan->id] = -460; politics_data.diplomacy[tclan->id][chclan->id] = -460; politics_data.end_current_state[chclan->id][tclan->id] = FALSE; politics_data.end_current_state[tclan->id][chclan->id] = FALSE; } else { politics_data.diplomacy[chclan->id][tclan->id] -= 50; politics_data.diplomacy[tclan->id][chclan->id] -= 50; sprintf(buf, "You are requesting a more aggressive state of affairs with %s.\r\n", tclan->name); send_to_char(buf, ch); } } /* E N D */ else if (!str_cmp(arg2, "end")) { if (politics_data.diplomacy[chclan->id][tclan->id] > 450 ) { send_to_char("You are negotiating an end to your alliance.\r\n", ch); politics_data.end_current_state[chclan->id][tclan->id] = FALSE; politics_data.end_current_state[tclan->id][chclan->id] = FALSE; politics_data.diplomacy[chclan->id][tclan->id] = 100; politics_data.diplomacy[tclan->id][chclan->id] = 100; } if (politics_data.diplomacy[chclan->id][tclan->id] < -450 ) { politics_data.end_current_state[chclan->id][tclan->id] = TRUE; if (politics_data.end_current_state[chclan->id][tclan->id] && politics_data.end_current_state[tclan->id][chclan->id]) send_to_char("Both clans have successfully negotiated and end to the war. Negotiate peace to seal your treaty!\r\n", ch); else send_to_char("You have requested an end to this dreaded war, but the other clan has not yet agreed.\r\n", ch); } else { send_to_char("You must be either at war or in an alliance with a clan before you can END it.\r\n", ch); return; } } else { send_to_char( "That is not a legal diplomatic negotiation!\n\r", ch ); return; } politics_data.daily_negotiate_table[chclan->id][tclan->id] = TRUE; /* save table to file here */ save_clan_table(); } /* * Character ask to be allowed to be members of the clan */ void do_clan_apply(CHAR_DATA *ch, char *arg) { CLAN_DATA *pClan; if (!(*arg)) { send_clan_format(ch); return; } if (GET_LEVEL(ch) >= LVL_IMMORT) { send_to_char("Gods cannot apply for any clan.\r\n", ch); return; } if (GET_CLAN(ch) != -1) { send_to_char("You already belong to a clan!\r\n",ch); return; } if (!(pClan = find_clan(arg))) { send_to_char("Unknown clan.\r\n", ch); return; } if (IS_SET(pClan->ctype, CLAN_SECRET) && GET_CLAN_RANK(ch) != RANK_INVITED) { send_to_char("Unknown clan.\r\n", ch); return; } if (IS_SET(pClan->status, CLAN_INACTIVE) || IS_SET(pClan->status, CLAN_DISBANDING)) { send_to_char("Sorry, but the clan does not accept new members at the moment.\r\n", ch); return; } if (IS_SET(pClan->ctype, CLAN_PRIVATE) && GET_CLAN_RANK(ch) != RANK_INVITED) { send_to_char("Sorry, but you have to be invited to join the clan before apply.\r\n", ch); return; } if (GET_LEVEL(ch) < pClan->app_level) { send_to_char("You are not mighty enough to apply to this clan.\r\n",ch); return; } if (GET_LEVEL(ch) > pClan->max_level) { send_to_char("You are too mighty to apply to this clan.\r\n",ch); return; } if (!check_membership(ch, pClan)) { send_to_char("Sorry, but you cannot be a member of this clan.\r\n", ch); return; } if ( get_gold(ch) < pClan->app_fee) { send_to_char("You cannot afford the application fee!\r\n", ch); return; } sub_gold(ch, pClan->app_fee); pClan->treasure += pClan->app_fee; fwrite_clan(pClan); GET_CLAN(ch) = pClan->id; GET_CLAN_RANK(ch) = RANK_APPLIER; save_char(ch, NULL); send_to_char("You've applied to the clan!\r\n",ch); } /* core of clan command */ void do_clan_set(CHAR_DATA *ch, char *arg) { char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH]; half_chop(arg, arg1, arg2); if (is_abbrev(arg1, "dues" )) { do_clan_money(ch, arg2, CM_DUES); return ;} if (is_abbrev(arg1, "appfee" )) { do_clan_money(ch, arg2, CM_APPFEE); return ;} if (is_abbrev(arg1, "applev" )) { do_clan_application(ch, arg2); return ;} send_clan_format(ch); } ACMD(do_clan) { char arg1[MAX_INPUT_LENGTH], *arg2; arg2 = one_argument(argument, arg1); skip_spaces(&arg2); if (is_abbrev(arg1, "apply" )) { do_clan_apply(ch, arg2); return; } if (is_abbrev(arg1, "info" )) { do_clan_info(ch, arg2); return; } // no clan member.. handle gods that wanna create a clan if (GET_CLAN(ch) == -1 || !get_clan(GET_CLAN(ch))) { if (GET_LEVEL(ch) >= LVL_CLAN_GOD && isname(arg1, "create")) do_clan_create(ch, arg2); else { send_to_char("You do not belong to a clan!\r\n",ch); send_clan_format(ch); } return; } // unranked ppl exit here.. if (GET_CLAN_RANK(ch) <= RANK_APPLIER) return; /* some checks to see if he can use that command */ if (isname(arg1, "disband revive magistrate hero") && GET_CLAN_RANK(ch) < RANK_LEADER) { send_to_char("You're not influent enough in the clan to do that!\r\n", ch); return; } if (isname(arg1, "build enroll expel demote promote invite set diplomat") && GET_CLAN_RANK(ch) < RANK_PRIVILEGES) { send_to_char("You're not influent enough in the clan to do that!\r\n", ch); return; } /* Gods or God Patron only */ if (is_abbrev(arg1, "create" )) { do_clan_create(ch, arg2); return; } if (is_abbrev(arg1, "disband" )) { do_clan_disband(ch); return; } if (is_abbrev(arg1, "revive" )) { do_clan_revive(ch); return; } /* Privileged members only */ if (is_abbrev(arg1, "build" )) { do_clan_build(ch, arg2); return; } if (is_abbrev(arg1, "demote" )) { do_clan_demote(ch, arg2); return; } if (is_abbrev(arg1, "enroll" )) { do_clan_enroll(ch, arg2); return; } if (is_abbrev(arg1, "expel" )) { do_clan_expel(ch, arg2); return; } if (is_abbrev(arg1, "invite" )) { do_clan_invite(ch, arg2); return; } if (is_abbrev(arg1, "promote" )) { do_clan_promote(ch, arg2); return; } if (is_abbrev(arg1, "set" )) { do_clan_set(ch, arg2); return; } if (isname(arg1, "diplomat magistrate hero")) { do_clan_specialrank(ch, arg1, arg2); return; } if (is_abbrev(arg1, "withdraw" )) { do_clan_bank(ch, arg2, CB_WITHDRAW); return ;} if (is_abbrev(arg1, "deposit" )) { do_clan_bank(ch, arg2, CB_DEPOSIT); return ;} /* all members */ if (is_abbrev(arg1, "who" )) { do_clan_who(ch); return ;} if (is_abbrev(arg1, "status" )) { do_clan_status(ch); return ;} send_clan_format(ch); } /* * commands for everyone */ /* show what's going on in politic field */ char *get_diplo_name(sh_int value) { char *name = '\0'; if ( value < -450 ) name = " WAR "; else if ( value < -300 ) name = "HATRED "; else if ( value < -150 ) name = "DISLIKE"; else if ( value < 150 ) name = "NEUTRAL"; else if ( value < 300 ) name = "RESPECT"; else if ( value < 450 ) name = " TRUST "; else name = " ALLY "; return (name); } ACMD(do_politics) { CLAN_DATA *pClan, *pClan2; char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH]; if (IS_NPC(ch)) { send_to_char("Not for Npcs.\r\n", ch); return; } send_to_char("Current Politics of Lyonesse Mud\r\n\r\n", ch); if (num_of_vis_clans() < 2) { send_to_char("Too few clans to have politics, sorry.\r\n", ch); return; } buf[0] = '\0'; buf2[0] = '\0'; sprintf(buf, " "); strcat(buf2, buf); for (pClan = clans_table; pClan; pClan = pClan->next) { if (IS_SET(pClan->ctype, CLAN_SECRET)) continue; sprintf(buf, " %-5s ", pClan->abbr); strcat(buf2, buf); } buf[0] = '\0'; sprintf(buf, "\r\n\r\n"); strcat(buf2, buf); send_to_char(buf2 , ch); for (pClan = clans_table; pClan; pClan = pClan->next) { /* clan symbol here */ buf[0] = '\0'; buf2[0] = '\0'; if (IS_SET(pClan->ctype, CLAN_SECRET) && GET_LEVEL(ch) < LVL_GRGOD) continue; sprintf(buf,"%1i %-5s ", pClan->id, pClan->abbr); strcat(buf2, buf); for (pClan2 = clans_table; pClan2; pClan2 = pClan2->next) { buf[0] = '\0'; if (IS_SET(pClan2->ctype, CLAN_SECRET) && GET_LEVEL(ch) < LVL_GRGOD) continue; if (pClan->id != pClan2->id) sprintf(buf, "%-7s ", get_diplo_name(politics_data.diplomacy[pClan->id][pClan2->id])); else sprintf(buf, " "); strcat(buf2, buf); } sprintf(buf, "\n\r\n\r"); strcat(buf2, buf); send_to_char( buf2, ch ); } if (GET_CLAN_RANK(ch) == RANK_DIPLOMAT) { for (pClan = clans_table; pClan; pClan = pClan->next) { if (politics_data.end_current_state[GET_CLAN(ch)][pClan->id]) { sprintf(buf, "%s has requested an end to your current state of affairs", pClan->name); send_to_char(buf, ch); } } } } void show_clan_politic( CHAR_DATA *ch, int idnum ) { CLAN_DATA *pClan; if ( !ch || !get_clan(idnum) ) return; for (pClan = clans_table; pClan; pClan = pClan->next) { if (pClan->id == idnum) continue; if (IS_SET(pClan->ctype, CLAN_SECRET) && GET_LEVEL(ch) < LVL_GRGOD) continue; ch_printf(ch, "Clan (%d) %s: --> %s <--\r\n", pClan->id, pClan->name, get_diplo_name(politics_data.diplomacy[idnum][pClan->id]) ); } }