/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David * * Love, Guilherme 'Willie' Arnold, and Mitchell Tse. * * * * In order to use any part of this Envy Diku Mud, you must comply with * * the original Diku license in 'license.doc', the Merc license in * * 'license.txt', as well as the Envy license in 'license.nvy'. * * In particular, you may not remove either of these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*$Id: act_info2.c,v 1.17 2005/04/10 16:29:00 tyrion Exp $*/ #if defined( macintosh ) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" /* * Contributed by Grodyn. */ void do_config( CHAR_DATA *ch, char *argument ) { char arg [ MAX_INPUT_LENGTH ]; if ( IS_NPC( ch ) ) return; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char(AT_BLOOD, "[ Keyword ] Option\n\r", ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOEXIT ) ? "[+AUTOEXIT ] You automatically see exits.\n\r" : "[-autoexit ] You don't automatically see exits.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOGOLD ) ? "[+AUTOGOLD ] You automatically get gold from corpses.\n\r" : "[-autogold ] You don't automatically get gold from corpses.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOLOOT ) ? "[+AUTOLOOT ] You automatically loot corpses.\n\r" : "[-autoloot ] You don't automatically loot corpses.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_AUTOSAC ) ? "[+AUTOSAC ] You automatically sacrifice corpses.\n\r" : "[-autosac ] You don't automatically sacrifice corpses.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_ANSI ) ? "[+ANSI ] You have ansi color enabled.\n\r" : "[-ansi ] You have ansi color disabled.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_KEEPTITLE ) ? "[+KEEP ] You keep the same title when leveling.\n\r" : "[-keep ] You have the MUD select a new title for you.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_BLANK ) ? "[+BLANK ] You have a blank line before your prompt.\n\r" : "[-blank ] You have no blank line before your prompt.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_BRIEF ) ? "[+BRIEF ] You see brief descriptions.\n\r" : "[-brief ] You see long descriptions.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_COMBINE ) ? "[+COMBINE ] You see object lists in combined format.\n\r" : "[-combine ] You see object lists in single format.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_PROMPT ) ? "[+PROMPT ] You have a prompt.\n\r" : "[-prompt ] You don't have a prompt.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_TELNET_GA ) ? "[+TELNETGA ] You receive a telnet GA sequence.\n\r" : "[-telnetga ] You don't receive a telnet GA sequence.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_COMBAT ) ? "[+COMBAT ] You see all combat scroll.\n\r" : "[-combat ] You do not see dodge/parry/miss in combat.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_SOUND ) ? "[+SOUND ] You hear all sounds. See HELP 'SOUND EFFECTS'.\n\r" : "[-sound ] You do not hear sounds. See HELP 'SOUND EFFECTS'.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_MUSIC ) ? "[+MUSIC ] You hear all midi. See HELP 'SOUND EFFECTS'.\n\r" : "[-music ] You do not hear midi. See HELP 'SOUND EFFECTS.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_GHOST ) ? "[+GHOST ] You turn into a ghost upon death.\n\r" : "[-ghost ] You do not turn into a ghost upon death.\n\r" , ch ); send_to_char(AT_RED, IS_SET( ch->act, PLR_SILENCE ) ? "[+SILENCE ] You are silenced.\n\r" : "" , ch ); send_to_char(AT_RED, !IS_SET( ch->act, PLR_NO_EMOTE ) ? "" : "[-emote ] You can't emote.\n\r" , ch ); send_to_char(AT_RED, !IS_SET( ch->act, PLR_NO_TELL ) ? "" : "[-tell ] You can't use 'tell'.\n\r" , ch ); } else { char buf [ MAX_STRING_LENGTH ]; int bit; bool fSet; if ( arg[0] == '+' ) fSet = TRUE; else if ( arg[0] == '-' ) fSet = FALSE; else { send_to_char(AT_BLOOD, "Config -option or +option?\n\r", ch ); return; } if ( !str_cmp( arg+1, "autoexit" ) ) bit = PLR_AUTOEXIT; else if ( !str_cmp( arg+1, "autoloot" ) ) bit = PLR_AUTOLOOT; else if ( !str_cmp( arg+1, "autogold" ) ) bit = PLR_AUTOGOLD; else if ( !str_cmp( arg+1, "autosac" ) ) bit = PLR_AUTOSAC; else if ( !str_cmp( arg+1, "autosac" ) ) bit = PLR_AUTOGOLD; else if ( !str_cmp( arg+1, "blank" ) ) bit = PLR_BLANK; else if ( !str_cmp( arg+1, "brief" ) ) bit = PLR_BRIEF; else if ( !str_cmp( arg+1, "combine" ) ) bit = PLR_COMBINE; else if ( !str_cmp( arg+1, "prompt" ) ) bit = PLR_PROMPT; else if ( !str_cmp( arg+1, "telnetga" ) ) bit = PLR_TELNET_GA; else if ( !str_cmp( arg+1, "ansi" ) ) bit = PLR_ANSI; else if ( !str_cmp( arg+1, "keep" ) ) bit = PLR_KEEPTITLE; else if ( !str_cmp( arg+1, "combat" ) ) bit = PLR_COMBAT; else if ( !str_cmp( arg+1, "sound" ) ) bit = PLR_SOUND; else if ( !str_cmp( arg+1, "music" ) ) bit = PLR_MUSIC; else if ( !str_cmp( arg+1, "ghost" ) ) bit = PLR_GHOST; else { send_to_char(AT_BLOOD, "Config which option?\n\r", ch ); return; } if( !IS_IMMORTAL( ch ) ) { if( bit == PLR_GHOST && ch->level > 50 && !fSet) { send_to_char(AT_BLOOD, "You can't.\n\r", ch ); return; } } if ( fSet ) { SET_BIT ( ch->act, bit ); sprintf( buf, "%s is now ON.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_RED, buf, ch ); } else { REMOVE_BIT ( ch->act, bit ); sprintf( buf, "%s is now OFF.\n\r", arg+1 ); buf[0] = UPPER( buf[0] ); send_to_char(AT_RED, buf, ch ); } } return; } void do_wizlist ( CHAR_DATA *ch, char *argument ) { do_help ( ch, "wizlist" ); return; } void do_spells ( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; int sn; int col; if ( IS_NPC( ch ) || ( !IS_NPC( ch ) && !class_table[ch->class].fMana ) ) { send_to_char ( AT_BLUE, "You do not know how to cast spells!\n\r", ch ); return; } col = 0; for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ ) { if ( !skill_table[sn].name ) break; if ( ch->level < skill_table[sn].skill_level[ch->class] ) continue; if ( !skill_table[sn].is_spell ) continue; if (( ch->class != 9 )&&( ch->class != 11)) sprintf ( buf, "%26s %3dpts ", skill_table[sn].name, MANA_COST( ch, sn ) ); else sprintf( buf, "%26s %2dpts ", skill_table[sn].name, (MANA_COST( ch, sn)/5) ); send_to_char( AT_BLUE, buf, ch ); if ( ++col % 2 == 0 ) send_to_char( AT_BLUE, "\n\r", ch ); } if ( col % 2 != 0 ) send_to_char( AT_BLUE, "\n\r", ch ); return; } void do_slist ( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; int sn; int col; int level; int profession; int profession2; int iClass; bool pSpell; profession = ch->class; profession2 = ch->multied; for ( ;; ) { char arg [MAX_STRING_LENGTH]; argument = one_argument ( argument, arg ); if ( arg[0] == '\0' ) break; if (strlen(arg) < 3) { send_to_char(AT_GREEN, "Thats not a class\n\r", ch ); return; } arg[3] = '\0'; for (iClass = 0; iClass < MAX_CLASS; iClass++) { if (!str_cmp(arg,class_table[iClass].who_name)) { profession = iClass; profession2 = iClass; break; } } if (iClass == MAX_CLASS) { send_to_char(AT_GREEN, "Thats not a class\n\r", ch ); return; } } if ( IS_NPC( ch ) ) { send_to_char (AT_BLUE, "You do not need any stinking spells!\n\r", ch ); return; } send_to_char( AT_BLUE, "Lv Spells/Skill\n\r\n\r", ch ); for ( level = 1; level <= LEVEL_DEMIGOD; level++ ) { col = 0; pSpell = TRUE; for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ ) { if ( !skill_table[sn].name ) break; if ( skill_table[sn].skill_level[profession] != level && skill_table[sn].skill_level[profession2] != level ) continue; /* Added a check to stop double display of skills from both classes --Manaux */ if (UMIN ( skill_table[sn].skill_level[profession], skill_table[sn].skill_level[profession2] ) != level ) continue; if ( pSpell ) { sprintf ( buf, "%2d:", level ); send_to_char( AT_BLUE, buf, ch ); pSpell = FALSE; } if ( ++col % 4 == 0 ) send_to_char( AT_BLUE, " ", ch ); sprintf ( buf, "%25s", skill_table[sn].name ); send_to_char( AT_BLUE, buf, ch ); if ( col % 3 == 0 ) send_to_char(AT_BLUE, "\n\r", ch ); } if ( col % 3 != 0 ) send_to_char( AT_BLUE, "\n\r", ch ); } return; } /* bypassing the config command - Kahn */ void do_autoexit ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_AUTOEXIT ) ? sprintf( buf, "-autoexit" ) : sprintf( buf, "+autoexit" ) ); do_config( ch, buf ); return; } void do_autoloot ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_AUTOLOOT ) ? sprintf( buf, "-autoloot" ) : sprintf( buf, "+autoloot" ) ); do_config( ch, buf ); return; } void do_autosac ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_AUTOSAC ) ? sprintf( buf, "-autosac" ) : sprintf( buf, "+autosac" ) ); do_config( ch, buf ); return; } void do_blank ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_BLANK ) ? sprintf( buf, "-blank" ) : sprintf( buf, "+blank" ) ); do_config( ch, buf ); return; } void do_brief ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_BRIEF ) ? sprintf( buf, "-brief" ) : sprintf( buf, "+brief" ) ) ; do_config( ch, buf ); return; } void do_combine ( CHAR_DATA *ch, char *argument ) { char buf[ MAX_STRING_LENGTH ]; ( IS_SET ( ch->act, PLR_COMBINE ) ? sprintf( buf, "-combine" ) : sprintf( buf, "+combine" ) ); do_config( ch, buf ); return; } void do_pagelen ( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char arg [ MAX_INPUT_LENGTH ]; int lines; one_argument( argument, arg ); if ( arg[0] == '\0' ) lines = 20; else lines = atoi( arg ); if ( lines < 1 ) { send_to_char(C_DEFAULT, "Negative or Zero values for a page pause are not legal.\n\r", ch ); return; } if ( lines > 60 ) { send_to_char(C_DEFAULT, "I don't know of a screen that is larger than 60 lines!\n\r", ch ); lines = 60; } ch->pcdata->pagelen = lines; sprintf( buf, "Page pause set to %d lines.\n\r", lines ); send_to_char(C_DEFAULT, buf, ch ); return; } /* Do_prompt from Morgenes from Aldara Mud */ void do_prompt( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; buf[0] = '\0'; ch = ( ch->desc->original ? ch->desc->original : ch->desc->character ); if ( argument[0] == '\0' ) { ( IS_SET ( ch->act, PLR_PROMPT ) ? sprintf( buf, "-prompt" ) : sprintf( buf, "+prompt" ) ); do_config( ch, buf ); return; } if( !strcmp( argument, "all" ) ) strcat( buf, "<%hhp %mm %vmv> "); else { if ( strlen( argument ) > 50 ) argument[50] = '\0'; smash_tilde( argument ); if ( strlen( argument ) < 2 ) sprintf( buf, "%s ", argument ); else strcat( buf, argument ); } free_string( ch->prompt ); ch->prompt = str_dup( buf ); send_to_char(C_DEFAULT, "Ok.\n\r", ch ); return; } void do_auto( CHAR_DATA *ch, char *argument ) { do_config( ch, "" ); return; } void do_afk( CHAR_DATA *ch, char *argument ) { if ( IS_NPC( ch ) ) return; if ( IS_SET( ch->act, PLR_AFK ) ) { REMOVE_BIT( ch->act, PLR_AFK ); send_to_char(AT_WHITE, "You are back at your keyboard.\n\r", ch ); act(AT_WHITE, "$n has returned to $s keyboard.", ch, NULL, ch, TO_ROOM ); } else { SET_BIT( ch->act, PLR_AFK ); send_to_char(AT_WHITE, "You are now away from keyboard.\n\r", ch ); act(AT_WHITE, "$n has left $s keyboard.", ch, NULL, ch, TO_ROOM ); } return; } int skill_irongrip( int sn, int level, CHAR_DATA *ch, void *vo ) { AFFECT_DATA af; if (is_affected(ch, sn)) { send_to_char(AT_BLUE, "You are already holding your weapon as tightly as you can!\n\r", ch); return SKPELL_BOTCHED; } af.type = sn; af.duration = ch->level / 6; af.location = APPLY_ANTI_DIS; af.modifier = ch->level - ( ch->level / 4 ); af.bitvector = 0; affect_to_char( ch, &af ); send_to_char( AT_BLUE, "You grip your weapon tightly.\n\r", ch ); return SKPELL_NO_DAMAGE; } void do_induct( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_STRING_LENGTH]; char const *clname; char buf [MAX_STRING_LENGTH]; CLAN_DATA *pClan; buf[0] = '\0'; one_argument( argument, arg ); if ( ( ch->clan == 0 ) || ( ch->clev < 2 ) ) return; if ( ! ( victim = get_char_room( ch, arg ) ) ) { send_to_char( AT_WHITE, "No such person is in the room.\n\r", ch ); return; } if IS_NPC(victim) return; if ( victim->clan != 0 ) return; pClan=get_clan_index(ch->clan); if ( !pClan ) return; if (pClan->members > 19) { send_to_char(AT_WHITE, "Your clan contains 20 people, you can't induct anymore!\n\r",ch); return; } pClan->members++; clname = pClan->name; sprintf( buf + strlen( buf ), "<%s", clname ); act(AT_RED, "$n has been inducted into $T.", victim, NULL, buf, TO_ROOM); act(AT_RED, "You are now a member of $T.", victim, NULL, buf, TO_CHAR); act(AT_RED, "You have inducted $N.", ch, NULL, victim, TO_CHAR); victim->clan = ch->clan; victim->clev = 0; return; } void do_outcast( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_STRING_LENGTH]; char const *clname; char buf [MAX_STRING_LENGTH]; CLAN_DATA *pClan; buf[0] = '\0'; one_argument( argument, arg ); if ( ( ch->clan == 0 ) || ( ch->clev < 2 ) ) return; if ( !( victim = get_char_room( ch, arg ) ) ) { send_to_char( AT_WHITE, "No such person is in the room.\n\r", ch ); return; } if IS_NPC(victim) return; if ( ( victim->clan == 0 ) || ( victim->clan != ch->clan ) ) return; pClan=get_clan_index(ch->clan); if ( !pClan ) return; pClan->members--; clname = pClan->name; sprintf ( buf + strlen( buf ), "<%s", clname ); act(AT_RED, "$n has been outcast from $T.", victim, NULL, buf, TO_ROOM); act(AT_RED, "You are no longer a member of $T.", victim, NULL, buf, TO_CHAR); act(AT_RED, "You have outcast $N.", ch, NULL, victim, TO_CHAR); victim->clan = 0; victim->clev = 0; if ( IS_AFFECTED2(victim, AFF_DOOMSHIELD) ) affect_strip(victim, skill_lookup("doomshield")); REMOVE_BIT(victim->act, PLR_CSKILL); return; } void do_setlev( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg1 [ MAX_INPUT_LENGTH ]; char arg2 [ MAX_INPUT_LENGTH ]; int level; CLAN_DATA *pClan; char const *cltitle; cltitle = "NONE"; /* init */ argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( ch->clev < 3 ) return; if ( arg1[0] == '\0' || arg2[0] == '\0' || !is_number( arg2 ) ) { send_to_char(AT_WHITE, "Syntax: setlev <char> <level>.\n\r", ch ); return; } if ( !( victim = get_char_room( ch, arg1 ) ) ) { send_to_char(AT_WHITE, "That player is not here.\n\r", ch); return; } if ( IS_NPC( victim ) ) { send_to_char(AT_WHITE, "Not on NPC's.\n\r", ch ); return; } if ( (ch->clan != victim->clan) || ( ch->clev < victim->clev ) ) return; level = atoi( arg2 ); if ( level > ch->clev ) { send_to_char(AT_WHITE, "Not above your own level.\n\r", ch); return; } if ( level < 0 || level > 4 ) { send_to_char(AT_WHITE, "Valid Levels are as follows\n\r", ch ); send_to_char(AT_WHITE, " 0 -> Regular member.\n\r", ch ); send_to_char(AT_WHITE, " 1 -> Level 1.\n\r", ch ); send_to_char(AT_WHITE, " 2 -> Level 2.\n\r", ch ); send_to_char(AT_WHITE, " 3 -> Level 3.\n\r", ch ); send_to_char(AT_WHITE, " 4 -> Level 4.\n\r", ch ); return; } pClan=get_clan_index(ch->clan); /* Lower a player in the Clan */ switch ( victim->clev ) { case 0: break; case 1: pClan->issecond=FALSE; free_string( pClan->second ); pClan->second = str_dup( "None" ); break; case 2: pClan->isfirst=FALSE; free_string( pClan->first ); pClan->first= str_dup( "None" ); break; case 3: pClan->isleader=FALSE; free_string( pClan->leader ); pClan->leader=str_dup( "None" ); break; case 4: pClan->ischamp=FALSE; free_string( pClan->champ ); pClan->champ = str_dup( "None" ); break; default: break; } switch ( level ) { default: break; case 0: break; case 1: if (pClan->issecond) { send_to_char(AT_WHITE, "Already exists, defaulting to regular member", ch ); level = 0; break; } else { pClan->issecond=TRUE; pClan->second = str_dup( victim->name ); break; } case 2: if (pClan->isfirst) { send_to_char(AT_WHITE, "Already exists, defaulting to regular member", ch ); level = 0; break; } else { pClan->isfirst=TRUE; pClan->first = str_dup( victim->name ); break; } case 3: if (pClan->isleader) { send_to_char(AT_WHITE, "Already exists, defaulting to regular member", ch ); level = 0; break; } else { pClan->isleader=TRUE; pClan->leader = str_dup( victim->name ); break; } case 4: if (pClan->ischamp) { send_to_char(AT_WHITE, "Already exists, defaulting to regular member", ch ); level = 0; break; } else { pClan->ischamp=TRUE; pClan->champ = str_dup( victim->name ); break; } } if ( level <= victim->clev ) { char buf [MAX_STRING_LENGTH]; buf[0] = '\0'; switch( level ) { case 0 : cltitle = "<"; break; case 1 : cltitle = "Level 1"; break; case 2 : cltitle = "Level 2"; break; case 3 : cltitle = "Level 3"; break; case 4 : cltitle = "Level 4"; break; default: cltitle = "[bug rep to imm]"; break; } sprintf( buf + strlen(buf), "%s %s>", cltitle, pClan->name ); act(AT_BLUE, "You have been lowered to $T.", victim, NULL, buf, TO_CHAR ); act(AT_BLUE, "Lowering a players clan level.", ch, NULL, NULL, TO_CHAR ); act(AT_BLUE, "$n is now $T", victim, NULL, buf, TO_ROOM ); victim->clev = level; return; } else { char buf [MAX_STRING_LENGTH]; buf[0] = '\0'; switch( level ) { case 0 : cltitle = "<"; break; case 1 : cltitle = "Level 1"; break; case 2 : cltitle = "Level 2"; break; case 3 : cltitle = "Level 3"; break; case 4 : cltitle = "Level 4"; break; } sprintf( buf + strlen(buf), "%s %s", cltitle, pClan->name ); act(AT_BLUE, "You have been raised to $T.", victim, NULL, buf, TO_CHAR ); act(AT_BLUE, "Raising a players clan level.", ch, NULL, NULL, TO_CHAR ); act(AT_BLUE, "$n is now $T", victim, NULL, buf, TO_ROOM ); victim->clev = level; return; } return; } void do_smash ( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; char buf [MAX_STRING_LENGTH]; char arg [MAX_INPUT_LENGTH]; CHAR_DATA *victim; char *name; buf[0]='\0'; one_argument( argument, arg ); if ( !(obj = get_obj_carry( ch, arg ) ) ) { send_to_char(AT_WHITE, "You do not have that doll.\n\r", ch ); return; } name = obj->name; if ( !(victim = get_char_room(ch, name) ) ) { send_to_char( AT_WHITE, "That person's life cannot be sensed.\n\r", ch ); return; } if ( !is_pkillable( ch, victim ) ) { return; } act(AT_RED, "You call down the Dark forces of Tyrion himself on $N.", ch, NULL, victim, TO_CHAR); act( AT_RED, "$n smashes $p.", ch, obj, NULL, TO_ROOM ); if ( !victim->wait ) act( AT_RED, "You feel a wave of nausia come over you.", victim, NULL, NULL, TO_CHAR ); extract_obj(obj); if ( victim->wait ) return; STUN_CHAR(victim, 3, STUN_TOTAL); victim->position = POS_STUNNED; victim->combat_timer = 90; update_pos( victim ); return; } void do_guild(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; if(argument[0] == '\0') { send_to_char(AT_WHITE, "Guild <char>\n\r", ch); return; } if(ch->guild == NULL) { send_to_char(AT_BLUE, "You must be in a guild to induct someone.\n\r", ch); return; } if(!is_name(ch->name, ch->guild->deity)) { send_to_char(AT_BLUE, "You are not the deity of this guild.\n\r", ch); return; } if((victim = get_char_world(ch, argument)) == NULL) { send_to_char(AT_BLUE, "Player not found.\n\r", ch); return; } if(IS_NPC(victim)) { send_to_char(AT_BLUE, "May guild PCs only.\n\r", ch); return; } if(victim->guild != NULL) { send_to_char(AT_BLUE, "That person is already guilded.\n\r", ch); } victim->guild = ch->guild; victim->guild_rank = 0; act(AT_BLUE, "You guild $N.", ch, NULL, victim, TO_CHAR); act(AT_BLUE, "$N guilds you.", victim, NULL, ch, TO_CHAR); return; } void do_unguild(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; if(argument[0] == '\0') { send_to_char(AT_WHITE, "Unguild <char>\n\r", ch); return; } if(ch->guild == NULL) { send_to_char(AT_BLUE, "You must be in a guild to unguild someone.\n\r", ch); return; } if(!is_name(ch->name, ch->guild->deity)) { send_to_char(AT_BLUE, "You are not the deity of this guild.\n\r", ch); return; } if((victim = get_char_world(ch, argument)) == NULL) { send_to_char(AT_BLUE, "Player not found.\n\r", ch); return; } if(victim->guild != ch->guild) { send_to_char(AT_BLUE, "That person is not in your guild.\n\r", ch); return; } victim->guild = NULL; act(AT_BLUE, "You unguild $N.", ch, NULL, victim, TO_CHAR); act(AT_BLUE, "$N unguilds you.", victim, NULL, ch, TO_CHAR); return; } void do_setrank(CHAR_DATA *ch, char *argument) { char arg1 [MAX_INPUT_LENGTH]; CHAR_DATA *victim; int value; argument = one_argument(argument, arg1); value = is_number(argument) ? atoi(argument) : 0; if(arg1[0] == '\0') { send_to_char(AT_WHITE, "Setrank <char> <rank num>\n\r", ch); send_to_char(AT_WHITE, " rank num > 0 \n\r", ch); return; } if(ch->guild == NULL) { send_to_char(AT_BLUE, "You must be in a guild to induct someone.\n\r", ch); return; } if(!is_name(ch->name, ch->guild->deity)) { send_to_char(AT_BLUE, "You are not the deity of this guild.\n\r", ch); return; } if((victim = get_char_world(ch, arg1)) == NULL) { send_to_char(AT_BLUE, "Player not found.\n\r", ch); return; } if(victim->guild != ch->guild) { send_to_char(AT_BLUE, "That person is not in your guild.\n\r", ch); return; } victim->guild_rank = value; send_to_char(AT_BLUE, "Ok.\n\r", ch); return; } void do_clans( CHAR_DATA *ch, char *argument ) { CLAN_DATA *pClan; char buf[MAX_STRING_LENGTH]; char result [ MAX_STRING_LENGTH*2 ]; /* May need tweaking. */ int chance; if ( clan_first == NULL ) return; sprintf( result, "&W[%3s&W] &W[ %13s&W] &W[ %12s&W] &W[%7s&W] &W[%6s&W] &W[%7s&W] \n\r", "&RNum", "&RClan Name", "&RRuler", "&RMembers", "&RPkills", "&RPkilled" ); for ( pClan = clan_first->next; pClan; pClan = pClan->next ) { chance = 0; if(pClan->pkills != 0 || pClan->pdeaths != 0) chance = (int) ( ((float)pClan->pkills / (float)(pClan->pkills + pClan->pdeaths) ) * 100 ); sprintf( buf, "&W[&R%3d&W] [&R%13s&W] [&R%12s&W] [&R%7d&W] [&R%6d&W] [&R%7d&W] \n\r", pClan->vnum, pClan->name, pClan->deity, pClan->members, pClan->pkills, pClan->pdeaths ); strcat( result, buf ); } send_to_char(AT_WHITE, result, ch ); return; } void do_cinfo( CHAR_DATA *ch, char *argument ) { CLAN_DATA *pClan; char buf[MAX_STRING_LENGTH]; int num; char arg1[MAX_INPUT_LENGTH]; argument = one_argument(argument, arg1); if (!(is_number(arg1))) { send_to_char(AT_WHITE, "Syntax: cinfo <clan number>\n\r", ch ); send_to_char(AT_WHITE, "Use the command clans to find a clan number.\n\r", ch ); return; } num = atoi(arg1); if (!(pClan = get_clan_index(num))) { send_to_char( AT_WHITE, "Illegal clan number, please try again.\n\r", ch ); return; } sprintf( buf, "------------------Information on <%s>-----------------\n\r\n\r", pClan->name ); send_to_char(AT_WHITE, buf, ch ); sprintf( buf, "Clan Owner [%12s]\n\r", pClan->deity ); send_to_char(AT_LBLUE, buf, ch ); sprintf( buf, "Rank 4: [%12s]\n\r", pClan->champ ); send_to_char( AT_CYAN, buf, ch ); sprintf( buf, "Rank 3: [%12s]\n\r", pClan->leader ); send_to_char( AT_BLUE, buf, ch ); sprintf( buf, "Rank 2: [%12s]\n\r", pClan->first ); send_to_char( AT_DBLUE, buf, ch ); sprintf( buf, "Rank 1: [%12s]\n\r", pClan->second ); send_to_char( AT_DBLUE, buf, ch ); sprintf( buf, "Members: [%12d]\n\r", pClan->members ); send_to_char(AT_DBLUE, buf, ch ); sprintf( buf, "Pkills: [%12d]\n\r", pClan->pkills ); send_to_char(AT_BLUE, buf, ch ); sprintf( buf, "Pkilled: [%12d]\n\r", pClan->pdeaths ); send_to_char(AT_CYAN, buf, ch ); sprintf( buf, "Mkills: [%12d]\n\r", pClan->mkills ); send_to_char(AT_LBLUE, buf, ch ); sprintf( buf, "Description:\n\r%s", pClan->description ); send_to_char( AT_WHITE, buf, ch ); return; } void do_autogold( CHAR_DATA *ch, char *argument ) { if ( IS_NPC( ch ) ) return; if ( IS_SET( ch->act, PLR_AUTOGOLD ) ) { do_config( ch, "-autogold" ); return; } if ( !IS_SET( ch->act, PLR_AUTOGOLD ) ) { do_config( ch, "+autogold" ); return; } return; } /* void do_vsi( CHAR_DATA *ch ) { char limbm[MAX_STRING_LENGTH]; int limb; for ( limb = 1; limb <= 2; limb++ ) { switch( ch->arm[limb]->hp ) { case 1: sprintf( limbm, "&RYour fingers from your %s hand are missing, and they are %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->arm[limb]->bl ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RYour %s hand is missing, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->arm[limb]->bl ); send_to_char( AT_WHITE, limbm, ch ); break; case 3: sprintf( limbm, "&RYour %s arm is missing past the elbow, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->arm[limb]->bl ); send_to_char( AT_WHITE, limbm, ch ); break; case 4: sprintf( limbm, "&RYou &B*&RWHOLE&B*&R %s arm is missing!, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->arm[limb]->bl ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } } switch( ch->neck->hp ) { case 1: sprintf( limbm, "&RYour neck is lightly hurt, and it is %s\n\r", bleedinglev( ch->neck->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RYour neck is severely hurt, and it is %s\n\r", bleedinglev( ch->neck->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 3: sprintf( limbm, "&RYour neck is broken!, and it is %s\n\r", bleedinglev( ch->neck->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 4: sprintf( limbm, "&RYour head is missing!, and your neck is %s\n\r", bleedinglev( ch->neck->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } switch( ch->eyes->hp ) { case 1: sprintf( limbm, "&ROne of your eyes has been gouged out, and it is %s\n\r", bleedinglev( ch->eyes->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RBoth of your eyes have been gouged out!, they are %s\n\r", bleedinglev( ch->eyes->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } switch( ch->torso->hp ) { case 1: sprintf( limbm, "&RYour torso is lightly wounded, and it is %s\n\r", bleedinglev( ch->torso->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RYour torso is badly wounded, and it is %s\n\r", bleedinglev( ch->torso->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 3: sprintf( limbm, "&RYour torso is severely wounded!, and it is %s\n\r", bleedinglev( ch->torso->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 4: sprintf( limbm, "&RYour bodyis missing halfway through your torso and down!,and it is %s\n\r", bleedintlev( ch->torso->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } for ( limb = 1; limb <= 2; limb++ ) { switch( ch->leg[limb]->hp ) { case 1: sprintf( limbm, "&RYour %s foot is missing, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->leg[limb]->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 2: sprintf( limbm, "&RYour %s leg is missing from the knee down, and it is %s\n\r", (limb == 1 ) ? "left" : "right", bleedinglev( ch->leg[limb]->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; case 3: sprintf( limbm, "&RYour whole %s leg is missing!, and it is %s\n\r", ( limb == 1 ) ? "left" : "right", bleedinglev( ch->leg[limb]->bl ) ); send_to_char( AT_WHITE, limbm, ch ); break; default: break; } } return; } */ /* char *bleedinglev( int blvl ) { switch( blvl ) { case 0: return "not bleeding."; case 1: return "bleeding lightly."; case 2: return "bleeding a lot."; case 3: return "bleeding severely!"; default: return ""; } return ""; } */ void do_farsight( CHAR_DATA *ch, char *argument ) { send_to_char(C_DEFAULT, "Huh?\n\r", ch ); return; /* CHAR_DATA *victim; char target_name[MAX_STRING_LENGTH]; ROOM_INDEX_DATA *from_room; if (IS_NPC(ch)) return; if (ch->clan != -1 ) { send_to_char(C_DEFAULT, "Huh?\n\r", ch ); return; } one_argument( argument, target_name ); if ( !( victim = get_char_world( ch, target_name ) ) || IS_SET( victim->in_room->room_flags, ROOM_PRIVATE ) || IS_SET( victim->in_room->room_flags, ROOM_SOLITARY ) || IS_SET( victim->in_room->area->area_flags, AREA_PROTOTYPE ) || IS_AFFECTED( victim, AFF_NOASTRAL ) || IS_AFFECTED4(victim, AFF_DECEPTION) ) { send_to_char(AT_BLUE, "You failed.\n\r", ch ); return; } if ( IS_SET(ch->in_room->area->area_flags, AREA_PRESENT) && (IS_SET( victim->in_room->area->area_flags, AREA_FUTURE ) || IS_SET( victim->in_room->area->area_flags, AREA_PAST ) ) ) { send_to_char(AT_BLUE, "You cannot!!!!!!!\n\r", ch ); return; } if ( IS_SET(ch->in_room->area->area_flags, AREA_FUTURE) && (IS_SET( victim->in_room->area->area_flags, AREA_PRESENT ) || IS_SET( victim->in_room->area->area_flags, AREA_PAST ) ) ) { send_to_char(AT_BLUE, "You cannot!!!!!!!\n\r", ch ); return; } if ( IS_SET(ch->in_room->area->area_flags, AREA_PAST) && (IS_SET( victim->in_room->area->area_flags, AREA_FUTURE ) || IS_SET( victim->in_room->area->area_flags, AREA_PRESENT ) ) ) { send_to_char(AT_BLUE, "You cannot!!!!!!!\n\r", ch ); return; } from_room = ch->in_room; if ( ch != victim ) { char_from_room( ch ); char_to_room( ch, victim->in_room ); } do_look( ch, "auto" ); if ( ch != victim ) { char_from_room( ch ); char_to_room( ch, from_room ); } return; */ } void do_worth( CHAR_DATA *ch, char *argument ) { if ( IS_NPC( ch ) ) return; if ( ch->level < LEVEL_HERO ) { sprintf( log_buf, "You have scored a total of %dxp, and are %dxp off from your" " next level.\n\r", ch->exp, ( ( ch->level + 1 ) * 1000 ) - ch->exp ); send_to_char( AT_RED, log_buf, ch ); } if ( ch->level == LEVEL_HERO ) { sprintf( log_buf, "You have scored a total of %dxp, and are %dxp off from your" " next level.\n\r", ch->exp, ( ( ch->level + 1 ) * 1000 ) + 1500 - ch->exp ); send_to_char( AT_RED, log_buf, ch ); } if ( ch->level == LEVEL_HERO1 ) { sprintf( log_buf, "You have scored a total of %dxp, and are %dxp off from your" " next level.\n\r", ch->exp, ( ( ch->level + 1 ) * 1000 ) + 5500 - ch->exp ); send_to_char( AT_RED, log_buf, ch ); } if ( ch->level == LEVEL_HERO2 ) { sprintf( log_buf, "You have scored a total of %dxp, and are %dxp off from your" " next level.\n\r", ch->exp, ( ( ch->level + 1 ) * 1000 ) + 12000 - ch->exp ); send_to_char( AT_RED, log_buf, ch ); } if ( ch->level == LEVEL_HERO3 ) { sprintf( log_buf, "You have scored a total of %dxp, and are %dxp off from your" " next level.\n\r", ch->exp, ( ( ch->level + 1 ) * 1000 ) + 31000 - ch->exp ); send_to_char( AT_RED, log_buf, ch ); } if ( ch->level == LEVEL_CHAMP ) { sprintf( log_buf, "You have scored a total of %dxp and are %dxp off from your" " next level.\n\r", ch->exp, ( ( ch->level + 1 ) * 1000 ) + 95000 - ch->exp ); send_to_char( AT_RED, log_buf, ch ); } if ( ch->level > LEVEL_CHAMP ) { sprintf( log_buf, "You have scored a total of %dxp.\n\r", ch->exp ); send_to_char( AT_RED, log_buf, ch ); } if ( ch->exp >= MAX_EXPERIENCE ) { send_to_char( AT_RED, "You perceive that you can level no higher by natural means.\n\r", ch ); } sprintf( log_buf, "Your current stats are:\n Str: %d. Wis: %d. Int: %d. Dex: %d. Con: %d.\n\r", get_curr_str( ch ), get_curr_wis( ch ), get_curr_int( ch ), get_curr_dex( ch ), get_curr_con( ch ) ); send_to_char( AT_RED, log_buf, ch ); sprintf( log_buf, "You are currently carrying %d coins.\n\r", ch->gold ); send_to_char( AT_RED, log_buf, ch ); return; } void do_finger( CHAR_DATA *ch, char *argument ) { char arg[MAX_STRING_LENGTH]; char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH*5]; USERL_DATA *ul; int nou = 0; int llvlr = 0; int hlvlr = L_IMP; argument = one_argument( argument, arg ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( is_number( arg1 ) ) llvlr = atoi( arg1 ); if ( is_number( arg2 ) ) hlvlr = atoi( arg2 ); if ( IS_NPC( ch ) ) return; if ( arg[0] == '\0' ) { send_to_char( AT_PURPLE, "Syntax: finger <playername>\n\r", ch ); return; } if ( !str_cmp( arg, "all" ) ) { if ( get_trust( ch ) < L_APP ) { send_to_char( AT_WHITE, "You cannot list all.\n\r", ch ); return; } for ( ul = user_list; ul; ul = ul->next ) { if ( ul->level >= llvlr && ul->level <= hlvlr ) { nou++; sprintf( log_buf, "%-20s Level:%3d Class:%s/%s\n\r", ul->name, ul->level, (ul->level >= LEVEL_IMMORTAL ? "Immortal" : (ul->class == 20 ? "Unknown" : class_table[ul->class].who_long)), (ul->class == ul->multi ? "NONE" : class_table[ul->multi].who_long)); send_to_char( AT_WHITE, log_buf, ch ); } } sprintf( log_buf, "There are %d people in the user list.\n\r", nou ); send_to_char( AT_WHITE, log_buf, ch ); return; } if ( !str_cmp( arg, "desc" ) ) { for ( ul = user_list; ul; ul = ul->next ) { if ( !str_cmp( ch->name, ul->name ) ) break; } if ( !ul ) { sprintf( log_buf, "Player with no ul [%s]", ch->name ); bug( log_buf, 0 ); return; } if ( !str_cmp( ul->desc, "(none)" ) ) free_string( ul->desc ); string_append( ch, &ul->desc ); if ( !ul->desc ) ul->desc = str_dup( "(none)" ); send_to_char( AT_WHITE, "Finger description changed.\n\r", ch ); return; } for( ul = user_list; ul; ul = ul->next ) { if ( !str_cmp( ul->name, arg ) ) break; } if ( !ul ) { send_to_char( AT_WHITE, "No such person exists here.\n\r", ch ); return; } else { sprintf( log_buf, "Name: %s. ", ul->name ); if ( ch->level > 100 ) sprintf( buf, "Email: %s@%s Last updated level: %d\n\r", ul->user, ul->host, ul->level ); else sprintf( buf, "\n\r" ); strcat( log_buf, buf ); send_to_char( AT_WHITE, log_buf, ch ); sprintf(buf, "Class: %s\n\r", (ul->level >= LEVEL_IMMORTAL ? "Immortal" : (ul->class == 20 ? "Unknown" : class_table[ul->class].who_long))); send_to_char( AT_WHITE, buf, ch); sprintf(buf, "Multi: %s\n\r", (ul->class == ul->multi ? "NONE" : class_table[ul->multi].who_long)); send_to_char( AT_WHITE, buf, ch); sprintf( log_buf, "Last Login: %s.\n\r", ( ul->lastlogin ? ul->lastlogin : "(none)" ) ); if ( ( ( get_trust( ch ) > 100 ) && ( ul->level > 100 ) ) || ul->level < L_APP ) send_to_char( AT_WHITE, log_buf, ch ); sprintf( buf, "Description:\n\r%s\n\r", ul->desc ); send_to_char( AT_WHITE, buf, ch ); return; } return; } void do_spells2 ( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; int sn; int col; int mana; if ( IS_NPC( ch ) || ( !IS_NPC( ch ) && !class_table[ch->class].fMana && !class_table[ch->multied].fMana ) ) { send_to_char ( AT_BLUE, "You do not know how to cast spells!\n\r", ch ); return; } col = 0; mana = 0; for ( sn = 0; skill_table[sn].name[0] != '\0'; sn++ ) { if ( !skill_table[sn].name ) break; if ( ch->level < skill_table[sn].skill_level[ch->class] && ch->level < skill_table[sn].skill_level[ch->multied] ) continue; if ( !skill_table[sn].is_spell ) continue; if ( ch->level >= skill_table[sn].skill_level[ch->class ] ) { mana = MANA_COST( ch, sn ); } if ( ch->level >= skill_table[sn].skill_level[ch->multied ] ) { mana = MANA_COST_MULTI( ch, sn ); } if ( ch->class == CLASS_VAMPIRE || ch->class == CLASS_ANTI_PALADIN ) { mana /= 4; } if (( ch->class != CLASS_VAMPIRE )&&( ch->class != CLASS_ANTI_PALADIN)) sprintf ( buf, "%26s %3dpts ", skill_table[sn].name, mana ); else sprintf( buf, "%26s %2dpts ", skill_table[sn].name, mana ); send_to_char( AT_BLUE, buf, ch ); if ( ++col % 2 == 0 ) send_to_char( AT_BLUE, "\n\r", ch ); } if ( col % 2 != 0 ) send_to_char( AT_BLUE, "\n\r", ch ); return; }