/************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefiting. We hope that you share your changes too. What goes * * around, comes around. * *************************************************************************** * ROM 2.4 is copyright 1993-1998 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@hypercube.org) * * Gabrielle Taylor (gtaylor@hypercube.org) * * Brian Moore (zump@rom.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * *************************************************************************** * 1stMUD ROM Derivative (c) 2001-2002 by Ryan Jennings * * http://1stmud.dlmud.com/ <r-jenn@shaw.ca> * ***************************************************************************/ #include <sys/types.h> #if !defined(WIN32) #include <sys/time.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include "merc.h" #include "interp.h" #include "lookup.h" #include "tables.h" bool is_leader(CHAR_DATA * ch) { return ch->rank == (MAX_RANK - 1); } CH_CMD(do_promote) { char arg1[MIL]; CHAR_DATA *victim; int rank; if (IS_NPC(ch)) return; argument = one_argument(argument, arg1); if ((!is_clan(ch) || !is_leader(ch)) && !IS_IMMORTAL(ch)) { chprintln(ch, "You must be a clan Leader to promote someone."); return; } if (IS_NULLSTR(arg1)) { chprintln(ch, "Syntax: promote <char> <rank #>"); return; } if ((victim = get_char_world(ch, arg1)) == NULL || IS_NPC(victim)) { chprintln(ch, "They aren't playing."); return; } if (!is_clan(victim) || is_leader(victim) || (!is_same_clan(ch, victim) && !IS_IMMORTAL(ch))) { chprintln(ch, "You can't promote them."); return; } if (!is_number(argument) || (atoi(argument) > MAX_RANK) || (atoi(argument) < 1)) { chprintlnf(ch, "Rank must be between 1 and %d.", MAX_RANK); return; } if ((rank = (atoi(argument) - 1)) == MAX_RANK - 1) { if ((number_classes(victim) < 3) && (victim->level < LEVEL_HERO / 4)) { chprintlnf (ch, "Only second or third tier players may be clan leaders before level %d.", LEVEL_HERO / 4); return; } } if (victim->rank > rank) { chprintlnf(ch, "They have been demoted to %s.", clan_table[victim->clan].rank[rank].rankname); chprintlnf(victim, "You have been demoted to %s, by %s.", clan_table[victim->clan].rank[rank].rankname, ch->name); victim->rank = rank; } else { chprintlnf(ch, "They are now a %s of clan %s.", clan_table[victim->clan].rank[rank].rankname, capitalize(clan_table[victim->clan].name)); chprintlnf(victim, "You are now a %s of clan %s.", clan_table[victim->clan].rank[rank].rankname, capitalize(clan_table[victim->clan].name)); victim->rank = rank; } } CH_CMD(do_clist) { int i; chprintln(ch, "Clans available:"); chprintln(ch, draw_line(NULL, 0)); for (i = 0; i < maxClan; i++) { chprintln(ch, clan_table[i].who_name); } chprintln(ch, draw_line(NULL, 0)); chprintln(ch, "For more info use 'cinfo <clan>'."); } CH_CMD(do_cinfo) { int i, r; if (argument[0] == '\0') { chprintln(ch, "Syntax: cinfo <clan name>"); return; } if ((i = clan_lookup(argument)) == -1) { chprintln(ch, "That is not a valid clan."); return; } chprintlnf(ch, "Name : %s", clan_table[i].name); chprintlnf(ch, "WhoName : %s", clan_table[i].who_name); chprintlnf(ch, "Indep : %s", clan_table[i].independent ? "TRUE" : "FALSE"); if (IS_IMMORTAL(ch)) chprintlnf(ch, "Hall : %ld", clan_table[i].hall); for (r = 0; r < MAX_RANK; r++) { chprintlnf(ch, "Rank %d : %s [%s]", r + 1, clan_table[i].rank[r].rankname, clan_table[i].rank[r].shortname); } } CH_CMD(do_clanrecall) { CHAR_DATA *victim; ROOM_INDEX_DATA *location; if (!is_clan(ch) || clan_table[ch->clan].independent) { chprintln(ch, "You're not in a clan."); return; } if (IS_NPC(ch) && !IS_SET(ch->act, ACT_PET)) { chprintln(ch, "Only player can recall."); return; } if (IS_SET(ch->in_room->room_flags, ROOM_ARENA)) { chprintln(ch, "You can't recall while in the arena!"); return; } act("$n prays for transportation!", ch, 0, 0, TO_ROOM); if ((location = get_room_index(clan_table[ch->clan].hall)) == NULL) { chprintln(ch, "Your clan doesnt seem to have a clan hall."); return; } if (ch->in_room == location) return; if (IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || IS_AFFECTED(ch, AFF_CURSE)) { act("$g has forsaken you.", ch, NULL, NULL, TO_CHAR); return; } if ((victim = ch->fighting) != NULL) { int lose, skill; skill = get_skill(ch, gsn_recall); if (number_percent() < 80 * skill / 100) { check_improve(ch, gsn_recall, FALSE, 6); WAIT_STATE(ch, 4); chprintln(ch, "You failed!"); return; } lose = (ch->desc != NULL) ? 25 : 50; gain_exp(ch, 0 - lose); check_improve(ch, gsn_recall, TRUE, 4); chprintlnf(ch, "You recall from combat! You lose %d exps.", lose); stop_fighting(ch, TRUE); } ch->move /= 2; act("$n disappears.", ch, NULL, NULL, TO_ROOM); char_from_room(ch); char_to_room(ch, location); act("$n appears in the room.", ch, NULL, NULL, TO_ROOM); do_function(ch, &do_look, "auto"); if (ch->pet != NULL) { act("$n disappears.", ch->pet, NULL, NULL, TO_ROOM); char_from_room(ch->pet); char_to_room(ch->pet, ch->in_room); act("$n appears in the room.", ch->pet, NULL, NULL, TO_ROOM); } return; } CH_CMD(do_clanadmin) { CHAR_DATA *victim; char arg1[MIL]; int clan; if (IS_NPC(ch)) return; if ((!is_clan(ch) || clan_table[ch->clan].independent || !is_leader(ch)) && !IS_IMMORTAL(ch)) { chprintln(ch, "You must be a valid clan leader to use this command."); return; } argument = one_argument(argument, arg1); if (IS_NULLSTR(arg1)) { chprintln (ch, " : clanadmin where - show location of all members online."); chprintln(ch, " : clanadmin promote <char> <rank#> - promote/demote a character."); chprintln(ch, " : clanadmin invite <char> - invite a character to your clan."); chprintln(ch, " : clanadmin outcast <char> - kick a person out of your clan."); if (IS_IMMORTAL(ch)) chprintln (ch, "Imm Syntax: clanadmin <clan> <command> - do a clanadmin command for a specific clan."); return; } if (IS_IMMORTAL(ch)) { char arg2[MIL]; if ((clan = clan_lookup(arg1)) == -1) { chprintln(ch, "Invalid clan."); return; } argument = one_argument(argument, arg2); strncpy(arg1, arg2, MIL); } else { clan = ch->clan; } if (!str_cmp(arg1, "where")) { bool found = FALSE; chprintln(ch, "Name Position Area"); chprintln(ch, "---- -------- ----"); for (victim = player_first; victim != NULL; victim = victim->next_player) { if (!IS_NPC(victim) && can_see(ch, victim) && !IS_SWITCHED(victim) && is_clan(victim) && victim->clan == clan) { chprintlnf(ch, "%-12s %-8s %s", victim->name, position_table[victim->position].name, victim->in_room ? victim->in_room-> area->name : "Unknown"); found = TRUE; } } if (!found) chprintln(ch, "No members found online."); return; } else if (!str_prefix(arg1, "promote")) { do_function(ch, &do_promote, argument); return; } else if (!str_prefix(arg1, "invite")) { if ((victim = get_char_world(ch, argument)) == NULL) { chprintln(ch, "They aren't playing."); return; } if (IS_NPC(victim)) { chprintln(ch, "NPC's cannot join clans."); return; } if (victim == ch) { chprintln(ch, "You're stuck...only a god can help you now!"); return; } if (is_clan(victim) && !clan_table[victim->clan].independent) { chprintln(ch, "They are in a clan already."); return; } if (victim->invited != -1) { chprintln(ch, "They have already been invited to join a clan."); return; } chprintlnf(ch, "%s has been invited to join your clan.", victim->name); chprintlnf(victim, "{RYou have been invited to join {x%s{x", clan_table[clan].who_name); chprintln(victim, "{YUse {Gjoin accept{Y to join this clan,{x"); chprintln(victim, "{Yor {Gjoin deny{Y to turn down the invitation.{x"); victim->invited = clan; return; } else if (!str_prefix(arg1, "outcast")) { if ((victim = get_char_world(ch, argument)) == NULL) { chprintln(ch, "There is no such player."); return; } if (IS_NPC(victim)) { chprintln(ch, "NPC's cannot join clans."); return; } if (victim == ch) { chprintln(ch, "You're stuck...only a god can help you now!"); return; } if (!is_clan(victim) || victim->clan != clan) { chprintln(ch, "They aren't in your clan."); return; } if (is_leader(victim) && !IS_IMMORTAL(ch)) { chprintln(ch, "You can't kick out another leader."); return; } chprintln(ch, "They are now clanless."); chprintln(victim, "Your clan leader has kicked you out!"); victim->clan = -1; victim->rank = 0; char_from_room(victim); char_to_room(victim, get_room_index(ROOM_VNUM_TEMPLE)); do_function(victim, &do_look, "auto"); return; } else do_function(ch, &do_clanadmin, ""); } CH_CMD(do_join) { char arg1[MIL]; CHAR_DATA *victim; argument = one_argument(argument, arg1); if (IS_NPC(ch)) { return; } if (is_clan(ch) && !clan_table[ch->clan].independent) { chprintln(ch, "You are already in a clan."); return; } if (ch->invited == -1) { chprintln(ch, "You have not been invited to join a clan."); return; } if (!str_cmp(arg1, "accept")) { for (victim = player_first; victim != NULL; victim = victim->next_player) if (is_clan(victim) && victim->clan == ch->invited) chprintlnf(victim, "%s accepts the invitation to join %s.", PERS(ch, victim), clan_table[victim->clan].name); ch->clan = ch->invited; ch->rank = 0; chprintlnf(ch, "{RYou are now a %s of {x%s{x", clan_table[ch->clan].rank[ch->rank].rankname, clan_table[ch->clan].who_name); ch->invited = -1; return; } else if (!str_cmp(arg1, "deny")) { chprintln(ch, "You turn down the invitation."); for (victim = player_first; victim != NULL; victim = victim->next_player) if (is_clan(victim) && victim->clan == ch->invited && victim->rank >= MAX_RANK - 2) chprintlnf(victim, "%s denies the invitation to join %s.", PERS(ch, victim), clan_table[victim->clan].name); ch->invited = -1; return; } else { chprintln(ch, "Syntax: join <accept|deny>"); return; } }