/*******************************************************************************
* _ | File Name: act_newc.c
* / \ _-' | Description: New Action code
* _/| \-''- _ / |
* __-' | \ |
* / \ |
* / "o. |o | |
* | \ ; |
* ', |
* \_ __\ | (c) 2000-2001 TAKA
* ''-_ \.// | (c) 2000-2001 The GhostMud Project Team
* / '-____' |
* / | You may use this code under GNU license restriction
* _' The Wolf | 1) This header block remains in the code.
* _-' strikes! | 2) You email me at a_ghost_dancer@excite.com
*_________________________| letting me know you are using this code
* please incluse your name, your mud name
* All rights reserved your mud address, your email and this file
* GhostMud is copyrighted name.
* by TAKA 3) In your help files mention me where appropriate
* IE: help snippets.
*********************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"
#include "recycle.h"
#include "tables.h"
#include "magic.h"
DECLARE_DO_FUN( do_knock );
DECLARE_DO_FUN( do_ushare );
DECLARE_DO_FUN( do_rename );
DECLARE_DO_FUN( do_butcher );
DECLARE_DO_FUN( do_wpeace );
DECLARE_DO_FUN( do_area_list );
DECLARE_DO_FUN( do_fremove );
DECLARE_DO_FUN( do_frecall );
DECLARE_DO_FUN( do_transfer );
DECLARE_DO_FUN( do_whowas );
DECLARE_DO_FUN( do_look );
DECLARE_DO_FUN( do_whois );
/* declarations -- may not need this for your mud */
DECLARE_DO_FUN( do_echo );
DECLARE_DO_FUN( do_exits ); /* 1201A */
DECLARE_DO_FUN( do_help ); /* 060801 */
DECLARE_DO_FUN( do_doas ); /* 060801 */
/* global values for paintball wars */
struct combat_type COMBAT_TABLE[MAX_COMBATANTS];
extern char * const where_name [];
extern void do_quit( CHAR_DATA *ch, char *argument );
extern int find_door args( ( CHAR_DATA *ch, char *arg ) );
extern void update_handler2( bool forced );
extern bool check_parse_name args( ( char *name ) );
extern void show_char_to_char args ((CHAR_DATA * list, CHAR_DATA * ch));
extern char *format_obj_to_char args ((OBJ_DATA * obj, CHAR_DATA * ch, bool fShort));
extern void AppendSlayMsg (SLAY_MESSAGE *SMptr); /* 010501 */
extern void save_slaym (); /* 010501 */
extern char *flag_string args ( ( const struct flag_type *flag_table, int bits ) );
bool write_version(char *argument);
void read_version(char *version);
void do_butcher(CHAR_DATA *ch, char *argument);
extern bool remove_obj args ((CHAR_DATA * ch, int iWear, bool fReplace));
void do_frecall( CHAR_DATA *ch, char *argument );
void whowas(CHAR_DATA *ch, FILE *fp);
void do_whowas(CHAR_DATA *ch, char *argument);
void do_rsetpword( CHAR_DATA *ch, char *argument );
void do_history( CHAR_DATA *ch, char *argument );
void do_pbwarstat args( ( CHAR_DATA *ch, char *argument ) );
void do_endpbwar args( ( CHAR_DATA *ch, char *argument ) );
void do_areset args( ( CHAR_DATA *ch, char *argument ) );
void window( CHAR_DATA *ch, OBJ_DATA *obj );
char *format_str_len(char * string, int length, int align);
void pet_affects(CHAR_DATA *ch, char *argument );
/*
Mortal spells and skills stat for immortals commands
by TAKA March 2000 (c)
*/
void do_mortskill(CHAR_DATA *ch, char *argument)
{
BUFFER *buffer;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char skill_list[LEVEL_HERO + 1][MAX_STRING_LENGTH];
char skill_columns[LEVEL_HERO + 1];
int sn, level, min_lev = 1, max_lev = LEVEL_HERO;
bool found = FALSE;
CHAR_DATA *victim;
if (IS_NPC(ch))
return;
one_argument(argument,arg);
if ( arg[0] == '\0' )
{
send_to_char( "{RList skills for whom?{x\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "{RThey aren't here.{x\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "{RUse this for skills on players.{x\n\r", ch );
return;
}
/* initialize data */
for (level = 0; level < LEVEL_HERO + 1; level++)
{
skill_columns[level] = 0;
skill_list[level][0] = '\0';
}
for (sn = 0; sn < MAX_SKILL; sn++)
{
if (skill_table[sn].name == NULL )
break;
if ((level = skill_table[sn].skill_level[victim->class]) < LEVEL_HERO + 1
&& level >= min_lev && level <= max_lev
&& skill_table[sn].spell_fun == spell_null
&& victim->pcdata->learned[sn] > 0)
{
found = TRUE;
level = skill_table[sn].skill_level[victim->class];
if (victim->level < level)
sprintf(buf,"{C%-18s {Yn{W/{Ya {x", skill_table[sn].name);
else
sprintf(buf,"{C%-18s {Y%3d%% {x",skill_table[sn].name,
victim->pcdata->learned[sn]);
if (skill_list[level][0] == '\0')
sprintf(skill_list[level],"\n\rLevel {W%3d:{x %s",level,buf);
else /* append */
{
if ( ++skill_columns[level] % 2 == 0)
strcat(skill_list[level],"\n\r ");
strcat(skill_list[level],buf);
}
}
}
/* return results */
if (!found)
{
send_to_char("{RNo skills found.{x\n\r",ch);
return;
}
buffer = new_buf();
for (level = 0; level < LEVEL_HERO + 1; level++)
if (skill_list[level][0] != '\0')
add_buf(buffer,skill_list[level]);
add_buf(buffer,"\n\r");
page_to_char(buf_string(buffer),ch);
free_buf(buffer);
}
void do_mortspell(CHAR_DATA *ch, char *argument)
{
BUFFER *buffer;
char buff[100];
char arg[MAX_INPUT_LENGTH];
char spell_list[LEVEL_HERO + 1][MAX_STRING_LENGTH];
char spell_columns[LEVEL_HERO + 1];
int sn, gn, col, level, min_lev = 1, max_lev = LEVEL_HERO, mana;
bool found = FALSE;
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
if (IS_NPC(ch))
return;
one_argument(argument,arg);
if ( arg[0] == '\0' )
{
send_to_char( "{RList spells for whom?{x\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "{RThey aren't here.{x\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "{RUse this for skills on players.{x\n\r", ch );
return;
}
/* groups */
col = 0;
for (gn = 0; gn < MAX_GROUP; gn++)
{
if (group_table[gn].name == NULL)
break;
if (victim->pcdata->group_known[gn])
{
sprintf(buff,"{G%-20s{x ",group_table[gn].name);
send_to_char(buff,ch);
if (++col % 3 == 0)
send_to_char("\n\r",ch);
}
}
if ( col % 3 != 0 )
{
send_to_char( "\n\r", ch );
sprintf(buff,"{GCreation points: {W%d{x\n\r",victim->pcdata->points);
send_to_char(buff,ch);
}
/* initialize data */
for (level = 0; level < LEVEL_HERO + 1; level++)
{
spell_columns[level] = 0;
spell_list[level][0] = '\0';
}
for (sn = 0; sn < MAX_SKILL; sn++)
{
if (skill_table[sn].name == NULL )
break;
if ((level = skill_table[sn].skill_level[victim->class]) < LEVEL_HERO + 1
&& level >= min_lev && level <= max_lev
&& skill_table[sn].spell_fun != spell_null
&& victim->pcdata->learned[sn] > 0)
{
found = TRUE;
level = skill_table[sn].skill_level[victim->class];
if (victim->level < level)
sprintf(buf,"{C%-18s {Yn{W/{Ya{x ", skill_table[sn].name);
else
{
mana = UMAX(skill_table[sn].min_mana, 100/(2 + victim->level - level));
sprintf(buf,"{C%-18s {Y%3d {Gmana{x ",skill_table[sn].name,mana);
}
if (spell_list[level][0] == '\0')
sprintf(spell_list[level],"\n\rLevel {W%3d:{x %s",level,buf);
else /* append */
{
if ( ++spell_columns[level] % 2 == 0)
strcat(spell_list[level],"\n\r ");
strcat(spell_list[level],buf);
}
}
}
/* return results */
if (!found)
{
send_to_char("{RNo spells found.{x\n\r",ch);
return;
}
buffer = new_buf();
for (level = 0; level < LEVEL_HERO + 1; level++)
if (spell_list[level][0] != '\0')
add_buf(buffer,spell_list[level]);
add_buf(buffer,"\n\r");
page_to_char(buf_string(buffer),ch);
free_buf(buffer);
}
/* End TAKA spell adds */
/*
* UNREMORT by TAKA of Ghost Dancer mud project.....
* (c) 2000 TAKA
*/
bool do_unremort args( ( CHAR_DATA *ch, char *argument ) )
{
char strsave[MAX_INPUT_LENGTH];
char strbackup[MAX_INPUT_LENGTH+4];
char buf[MAX_INPUT_LENGTH+4];
FILE *fp;
int result;
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( ch->name ) );
strcpy( strbackup, strsave );
strcat( strbackup, ".rmt" );
if ( ( fp = fopen( strbackup, "r" ) ) == NULL )
{
send_to_char("Invalid unremort state or you have already unremorted!\n\r", ch);
bug("close file", 0);
return FALSE;
}
fclose(fp);
/*
* unlink player
*/
send_to_char("wait about 30 seconds then resign in.....\n\r", ch);
do_quit(ch,"");
/*
* reset old pfile
*/
unlink( strsave );
result = rename ( strbackup, strsave );
if (result != 0)
{
sprintf( buf, "%s was not renamed to %s", strbackup, strsave);
bug(buf, 0);
}
else
{
sprintf( buf, "%s was renamed to %s", strbackup, strsave);
bug(buf, 0);
}
return TRUE;
}
/*
I saw comm stat on dark scapes I liked it and it and swiped it
the idea for me started there the code however is all original
-- TAKA
*/
void do_commstat( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA *d;
char buf[MAX_INPUT_LENGTH + 80];
send_to_char("{W Player gos auc mus ? quo gra rac sho qui AFK dea{x\n\r", ch);
for ( d = descriptor_list; d != NULL; d = d->next )
{
CHAR_DATA *victim;
victim = (d->original != NULL) ? d->original : d->character;
if ( d->connected != CON_PLAYING || !can_see(ch, d->character ))
continue;
sprintf(buf, "{W%-10s{G %s %s %s %s %s %s %s %s %s %s %s\n\r",
victim->name, IS_SET(victim->comm,COMM_NOGOSSIP)?"OFF":"ON ",
IS_SET(victim->comm,COMM_NOAUCTION)?"OFF":"ON ",
IS_SET(victim->comm,COMM_NOMUSIC)?"OFF":"ON ",
IS_SET(victim->comm,COMM_NOQUESTION)?"OFF":"ON ",
IS_SET(victim->comm,COMM_NOQUOTE)?"OFF":"ON ",
IS_SET(victim->comm,COMM_NOGRATS)?"OFF":"ON ",
/*IS_SET(victim->comm,COMM_NORACE)?"OFF":"ON ",*/
"OFF",
IS_SET(victim->comm,COMM_NOSHOUT)?"OFF":"ON ",
IS_SET(victim->comm,COMM_QUIET)?"{RON {x":"{ROFF{x",
IS_SET(victim->comm,COMM_AFK)?"{YYes{x":"{YNo {x",
IS_SET(victim->comm,COMM_DEAF)?"{DON {x":"{DOFF{x");
send_to_char(buf, ch);
if (IS_IMMORTAL(ch))
{
sprintf(buf, "{MGod channel: %s %s\n\r",
IS_SET(victim->comm,COMM_NOWIZ)?"OFF ":" ON ",
IS_SET(victim->comm,COMM_SNOOP_PROOF)?"{CImmune to snooping.{x\n\r":
"{CNot Immune to snooping.{x\n\r");
send_to_char(buf, ch);
}
}
return;
}
/**************************************************************************/
/*
* This function allows a character to knock on a door.
* -- TAKA (you're welcome)
*/
void do_knock(CHAR_DATA *ch, char *argument)
{
/* Some code taken from do_open(). */
long door;
char arg[MAX_INPUT_LENGTH];
one_argument(argument,arg);
if (arg[0] == '\0')
{
send_to_char("{RKnock on what?{x\n\r",ch);
return;
}
if ( ( door = find_door( ch, arg ) ) >= 0 )
{
ROOM_INDEX_DATA *to_room;
EXIT_DATA *pexit;
EXIT_DATA *pexit_rev;
pexit = ch->in_room->exit[door];
act( "{W$n {Rknocks on the $d.{x", ch, NULL, pexit->keyword, TO_ROOM );
act( "{RYou knock on the $d.{x", ch, NULL, pexit->keyword, TO_CHAR );
/* Notify the other side. */
if ( ( to_room = pexit->u1.to_room ) != NULL
&& ( pexit_rev = to_room->exit[rev_dir[door]] ) != NULL
&& pexit_rev->u1.to_room == ch->in_room )
{
CHAR_DATA *rch;
for ( rch = to_room->people; rch != NULL; rch = rch->next_in_room )
act( "{RYou hear someone knocking.{x", rch, NULL, pexit_rev->keyword, TO_CHAR );
}
}
return;
}
void do_ushare( CHAR_DATA *ch, char *argument ) /* by Maniac */
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
int share_no = 0;
if ( argument[0] == '\0' ) /* No options ??? */
{
send_to_char( "Ushare\n\r", ch );
send_to_char( "Ushare (share_number) (share_value).\n\r", ch );
return;
}
argument = one_argument(argument, arg1);
share_no = is_number(arg1) ? atoi(arg1) : -1;
if (share_no >= 1 && share_no <= NO_SHARES )
{
argument = one_argument(argument, arg2);
/*
* check if numberic value
*/
share_value[share_no] = is_number( arg2 ) ? atoi( arg2 ) : -1;
if (share_value[share_no] < 0)
share_value[share_no] = 1;
bank_update2( );
sprintf(buf, "OK. Bank share value %d updated to %d!\n\r",
share_no, share_value[share_no]);
send_to_char (buf, ch);
return;
}
else
{
send_to_char("That is not a value share number!", ch);
return;
}
return;
}
/* allow force tick */
void do_force_tick (CHAR_DATA *ch, char *argument )
{
update_handler2( TRUE );
send_to_char( "You Have Forced Time To Fly By....TICK\n\r", ch );
return;
}
/* end force tick TAKA */
/*
* Coded by: Thale (Andrew Maslin)
* Syntax: Rename <victim> <new_name>
* Limitations: This header must be kept with this function. In addition,
* this file is subject to the ROM license. The code in this file is
* copywritten by Andrew Maslin, 1998. If you have a "credits" help in your
* mud, please add the name Thale to that as credit for this function.
*/
void do_rename(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
FILE *fp;
char strsave[MAX_INPUT_LENGTH];
char *name;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
char playerfile[MAX_INPUT_LENGTH];
if (!IS_IMMORTAL(ch))
{
send_to_char("{RYou don't have the power to do that.{x\n\r",ch);
return;
}
argument = one_argument(argument,arg1);
argument = one_argument(argument,arg2);
if (arg1[0] == '\0')
{
send_to_char("{RRename who?{x\n\r",ch);
return;
}
if (arg2[0] == '\0')
{
send_to_char("{RWhat should their new name be?{x\n\r",ch);
return;
}
arg2[0] = UPPER(arg2[0]);
if ((victim = get_char_world(ch,arg1)) == NULL)
{
send_to_char("{RThey aren't connected.{x\n\r",ch);
return;
}
if (IS_NPC(victim))
{
send_to_char("{RUse string for NPC's.{x\n\r",ch);
return;
}
if (!check_parse_name(arg2))
{
sprintf(buf,"{RThe name {c%s{x is {Rnot allowed{x.\n\r",arg2);
send_to_char(buf,ch);
return;
}
sprintf(playerfile, "%s%s", PLAYER_DIR, capitalize(arg2));
if ((fp = fopen(playerfile, "r")) != NULL)
{
sprintf(buf,"{RThere is already someone named {W%s{R.{x\n\r",capitalize(arg2));
send_to_char(buf,ch);
fclose(fp);
return;
}
if ((victim->level >= ch->level) && (victim->level >= ch->trust)
&&((ch->level != IMPLEMENTOR) || (ch->trust != IMPLEMENTOR))
&&(ch != victim))
{
send_to_char("{RI don't think that's a good idea.{x\n\r",ch);
return;
}
if (victim->position == POS_FIGHTING)
{
send_to_char("{RThey are fighting right now.{x\n\r",ch);
return;
}
name = str_dup(victim->name);
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize(victim->name));
arg2[0] = UPPER(arg2[0]);
free_string(victim->name);
victim->name = str_dup(arg2);
save_char_obj(victim);
unlink(strsave);
#if defined(unix)
if (IS_IMMORTAL(victim))
{
sprintf(strsave,"%s%s", GOD_DIR, capitalize(name));
unlink(strsave);
}
#endif
if (victim != ch)
{
sprintf(buf,"{YNOTICE: {xYou have been renamed to {c%s{x.\n\r",arg2);
send_to_char(buf,victim);
}
send_to_char("{RDone.{x\n\r",ch);
return;
}
/*
* Version command read/write ect...
* by TAKA
*/
void do_version(CHAR_DATA *ch, char *argument)
{
char version[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
version[0]='\0';
if (IS_NPC(ch))
return;
if (ch->level < MAX_LEVEL) /* Stuff trusted characters! */
{
read_version( version );
sprintf(buf, "Current version is :- %s\n\r", version );
send_to_char(buf, ch);
return;
}
else
{
if (argument[0] == '\0')
{
read_version( version );
sprintf(buf, "Current version is :- %s\n\r", version );
send_to_char(buf, ch);
return;
}
else
{
if( write_version(argument) )
{
sprintf(buf, "Current version changed to %s\n\r", argument);
send_to_char(buf, ch);
sprintf(buf, "%s has changed the current version number to %s", ch->name, argument);
log_string( buf );
}
else
send_to_char("Write version failed - please report", ch);
/* report it on wiznet as well if you like... */
return;
}
}
}
bool write_version(char *argument) /*Returns true if sucsessful, else false*/
{
FILE *versionfp;
bool situation;
char buf[MAX_STRING_LENGTH];
fclose(fpReserve);
if ((versionfp = fopen(VERSION_FILE, "w"))==NULL)
{
bug("write_version : can't open version file",0);
situation = FALSE;
}
else
{
sprintf( buf, "%s\n", argument);
fprintf( versionfp, "#\n" );
fprintf( versionfp, buf);
fclose( versionfp );
situation = TRUE;
}
fpReserve = fopen(NULL_FILE, "r");
return situation;
}
void read_version(char *version) /*dumps the version No. in version */
{
FILE *versionfp;
fclose( fpReserve );
if ((versionfp = fopen(VERSION_FILE, "r"))==NULL)
{
bug("read_version : can't open version file",0);
sprintf( version, "V0.0 -- Please report!\n\r" );
}
else
{
if (fread_letter(versionfp) != '#')
{
bug("read_version : # not found",0);
sprintf( version, "V0.0 -- Please report!\n\r" );
fclose( versionfp );
}
else
{
sprintf(version, fread_string_eol( versionfp ));
fclose( versionfp );
}
}
fpReserve = fopen(NULL_FILE, "r");
return;
}
/* end of versions code by TAKA */
/*
* new commands added here are all by TAKA
* of ghost dancer.
* butcher - allows player to butcher corpses for food.
*/
/*
* Butcher Skill By TAKA
* I like the idea of steaks i saw this idea possibly in a snippet
* released by someone else!
*/
void do_butcher(CHAR_DATA *ch, char *argument)
{
/* If you have an interest in this skill, feel free */
/* to use it in your mud if you so desire. */
char buf[MSL];
char arg1[MSL];
int number_of_steaks = 0, sLoop;
OBJ_DATA *steak, *obj, *t_obj, *next_obj;
/* Check if they have the skill butcher */
if(!get_skill(ch,gsn_butcher))
{
printf_to_char(ch, "{RYou do not know how to butcher things!{x\n\r");
return;
}
one_argument(argument, arg1);
/* check if they entered something to butcher */
if(arg1[0]=='\0')
{
printf_to_char(ch, "{RWhat would you like to butcher?{x\n\r");
return;
}
/* check if the corpse is in the room */
obj = get_obj_list( ch, arg1, ch->in_room->contents );
/* If no corpse found */
if ( obj == NULL )
{
printf_to_char(ch, "{RYou do not see that in this room.{x\n\r");
return;
}
/* check item types for corpse PC and disallow it */
if(obj->item_type == ITEM_CORPSE_PC)
{
send_to_char( "{RThe gods would NOT approve.{x\n\r", ch );
return;
}
/* check item types for corpse NPC */
if(obj->item_type != ITEM_CORPSE_NPC)
{
send_to_char( "{RYou can only butcher corpses of NPCs.{x\n\r", ch );
return;
}
steak = create_object( get_obj_index(OBJ_VNUM_STEAK), 0 );
steak->value[0] = ch->level / 2;
steak->value[1] = ch->level;
/* Check the skill roll. */
if(number_percent( ) < get_skill(ch,gsn_butcher))
{
/* Allow 1 to 6 Steaks */
number_of_steaks = dice(1,6);
for(sLoop = 0; sLoop < number_of_steaks; sLoop++)
{
/* Create the steak and place it in the room */
steak = create_object( get_obj_index( OBJ_VNUM_STEAK ), 0 );
obj_to_room( steak, ch->in_room );
}
/* build message to room */
buf[0]='\0';
strcat(buf, "$n expertly butchers a corpse and creates ");
if(number_of_steaks < 2)
strcat(buf, "a steak");
else
strcat(buf, "some steaks");
act( buf, ch, NULL, NULL, TO_ROOM );
/* message to butcher */
printf_to_char(ch, "You butcher the corpse and create %s %s\n\r",
number_of_steaks == 1 ? "a" : number_of_steaks == 2 ? "two" : number_of_steaks == 3 ? "three" :
number_of_steaks == 4 ? "four" : number_of_steaks == 5 ? "five" : "six",
number_of_steaks < 2 ? "steak" : "steaks");
}
else
{
/* if failed */
act( "$n destroys a corpse with $s knife.", ch, NULL, NULL, TO_ROOM );
printf_to_char(ch, "You fail to butcher the corpse!");
}
/* check improvement here */
check_improve(ch,gsn_butcher,TRUE,1);
/* dump items caried */
/* Taken from the original ROM code update.c */
for (t_obj = obj->contains; t_obj != NULL; t_obj = next_obj)
{
next_obj = t_obj->next_content;
obj_from_obj(t_obj);
if (obj->in_obj) /* in another object */
obj_to_obj(t_obj,obj->in_obj);
else if (obj->carried_by) /* carried */
if (obj->wear_loc == WEAR_FLOAT)
if (obj->carried_by->in_room == NULL)
extract_obj(t_obj);
else
obj_to_room(t_obj,obj->carried_by->in_room);
else
obj_to_char(t_obj,obj->carried_by);
else if (obj->in_room == NULL) /* destroy it */
extract_obj(t_obj);
else /* to a room */
obj_to_room(t_obj,obj->in_room);
}
/* Now remove the corpse */
extract_obj(obj);
return;
}
/*
* (c) TAKA 2000 Ghost Dancer MUD Project
* forced remove and sieze
*/
void do_fremove( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
OBJ_DATA *obj_next;
OBJ_DATA *obj;
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0' )
{
send_to_char( "Syntax: fremove <char>\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "That player is not here.\n\r", ch);
return;
}
if ( victim->level > get_trust( ch) )
{
send_to_char( "Limited to your trust level.\n\r", ch );
return;
}
for (obj = victim->carrying; obj; obj = obj_next)
{
obj_next = obj->next_content;
if (obj->wear_loc != WEAR_NONE)
{
remove_obj (victim, obj->wear_loc, TRUE);
obj_from_char (obj);
obj_to_char (obj, ch);
}
}
save_char_obj(victim);
return;
}
/*
* (c) 2000 TAKA
* makes the world at peace took some of the code from do_peace
*/
void do_wpeace(CHAR_DATA *ch, char *argument )
{
CHAR_DATA *rch;
char buf[MAX_STRING_LENGTH];
rch = get_char_world( ch, buf );
for ( rch = char_list; rch; rch = rch->next )
{
if ( ch->desc == NULL || ch->desc->connected != CON_PLAYING )
continue;
if ( rch->fighting )
{
sprintf( buf, "%s has declared World Peace.\n\r", ch->name );
send_to_char( buf, rch );
stop_fighting( rch, TRUE );
}
}
send_to_char( "You have declared World Peace.\n\r", ch );
return;
}
/*
* (c) 2000 TAKA Ghost Dancer MUD Project
* list all areas
*/
void do_area_list( CHAR_DATA *ch, char *argument )
{
BUFFER *output;
char buf[MAX_STRING_LENGTH];
char result [ MAX_STRING_LENGTH*2 ]; /* May need tweaking. */
AREA_DATA *pArea;
output = new_buf();
sprintf( result, "{C[{M%3s{C] [{W%-27s{C] ({G%-5s{W-{G%5s{C) [{B%-10s{C]{x\n\r",
"Num", "Area Name", "lvnum", "uvnum", "Filename" );
send_to_char( result, ch );
for ( pArea = area_first; pArea; pArea = pArea->next )
{
sprintf( buf, "{C[{M%3ld{C] {W%-29.29s {C({G%-5ld{W-{G%5ld{C) {B%-12.12s{x\n\r",
pArea->vnum,
pArea->name,
pArea->min_vnum,
pArea->max_vnum,
pArea->file_name);
add_buf(output,buf);
}
page_to_char(buf_string(output),ch);
free_buf(output);
}
/*
* (c) 2000 TAKA Ghost Dancer MUD Project
* Loads a player file.
*/
void do_lpfile( CHAR_DATA *ch, char *argument )
{
DESCRIPTOR_DATA d;
bool isChar = FALSE;
char name[MAX_INPUT_LENGTH];
if (argument[0] == '\0')
{
send_to_char("{RLoad who?{x\n\r", ch);
return;
}
argument[0] = UPPER(argument[0]);
argument = one_argument(argument, name);
/*
* if player is already on do not load it
*/
if ( get_char_world( ch, name ) != NULL )
{
send_to_char( "{RThat person is allready playing!{x\n\r", ch );
return;
}
isChar = load_char_obj(&d, name); /* char pfile exists? */
if (!isChar)
{
send_to_char("{RThey do not exist!{x\n\r", ch);
return;
}
d.character->desc = NULL;
d.character->next = char_list;
char_list = d.character;
d.connected = CON_PLAYING;
reset_char(d.character);
/*
* player to imm room
*/
if ( d.character->in_room != NULL )
{
char_to_room( d.character, ch->in_room);
}
act( "{W$n {Ghas loaded {W$N!{x",
ch, NULL, d.character, TO_ROOM );
if (d.character->pet != NULL)
{
char_to_room(d.character->pet,d.character->in_room);
act("{W$n {Ghas entered the game.{x",d.character->pet,NULL,NULL,TO_ROOM);
}
}
/*
* (c) 2000 TAKA Ghost Dancer MUD Project
* Loads a player file.
*/
void do_ulpfile( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char who[MAX_INPUT_LENGTH];
argument = one_argument(argument, who);
/*
* unload only if found in the world
*/
if ( ( victim = get_char_world( ch, who ) ) == NULL )
{
send_to_char( "{RThey aren't here.{x\n\r", ch );
return;
}
/*
* player description == NULL then the player was a loaded pfile!
*/
if (victim->desc != NULL)
{
send_to_char("{RI dont think that would be a good idea...{x\n\r", ch);
return;
}
/*
* return player and pet to thier original room
*/
if (victim->was_in_room != NULL)
{
char_to_room(victim, victim->was_in_room);
if (victim->pet != NULL)
char_to_room(victim->pet, victim->was_in_room);
}
save_char_obj(victim);
do_quit(victim,"");
act("{W$n {Ghas released {W$N!",
ch, NULL, victim, TO_ROOM);
}
/*
* (c) TAKA 2000 Ghost Dancer MUD Project
* IMM Set password command
*/
void do_rsetpword( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
char *pwdnew;
if ( IS_NPC(ch) )
return;
argument=one_argument( argument, arg1 );
argument=one_argument( argument, arg2 );
victim = get_char_world(ch, arg1);
if ( ( ch->pcdata->pwd != '\0' )
&& ( arg1[0] == '\0' || arg2[0] == '\0') )
{
send_to_char( "Syntax: rsetpword <char> <new>.\n\r", ch );
return;
}
if( victim == '\0' )
{
send_to_char( "That person isn't here, they have to be here to reset pwd's.\n\r", ch);
return;
}
if ( IS_NPC( victim ) )
{
send_to_char( "You cannot change the password of NPCs!\n\r",ch);
return;
}
if ( strlen(arg2) < 5 )
{
send_to_char( "New password must be at least five characters long.\n\r", ch );
return;
}
pwdnew = (char *) crypt( arg2, victim->name );
free_string( victim->pcdata->pwd );
victim->pcdata->pwd = str_dup( pwdnew );
save_char_obj( victim );
send_to_char( "Ok.\n\r", ch );
sprintf( buf, "Your password has been changed to %s.", arg2 );
send_to_char( buf, victim);
return;
}
/*
* (c) 2000 TAKA Ghost Dancer MUD Project
* gets the player pword for the imp!
*/
void do_getpw( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
if (argument[0] == '\0')
{
send_to_char("Who?\n\r",ch);
return;
}
if ((victim = get_char_world(ch,argument)) == NULL)
{
send_to_char("You can't find them.\n\r",ch);
return;
}
if (get_trust(victim) > get_trust(ch))
{
stc("{RNot on your life!{x\n\r", ch);
printf_to_char(ch, "{W%s {Rtried to get your password{x\n\r", victim->name);
return;
}
sprintf(buf,"PW = %s", victim->pcdata->stor_pw);/*(char *) crypt(ch->pcdata->pwd, ch->name));*/
send_to_char(buf,ch);
return;
}
/*
* Lore written by TAKA (c) 2000 Ghost Dancer MUD Project
*/
void do_lore( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *obj;
AFFECT_DATA *paf;
char arg[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
one_argument( argument, arg );
obj = get_obj_world( ch, arg );
if ( obj == NULL )
{
sprintf( buf, "You've never heard of a %s.\n\r", arg );
send_to_char( buf, ch );
return;
}
if ( get_skill( ch, gsn_lore ) == 0 )
{
send_to_char( "You don't know anything about it.\n\r", ch );
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "What do you want information on?\n\r", ch );
return;
}
if ( number_percent( ) < get_skill( ch, gsn_lore ) )
{
sprintf( buf, "'%s' is type %s, extra flags %s.\n\rLevel %d.\n\r",
obj->name, item_name(obj->item_type), extra_bit_name( obj->extra_flags),
obj->level );
send_to_char( buf, ch );
/*if weapon*/
if (obj->item_type == 5)
{
sprintf( buf, "{GWeapons Flags{W:{B %s\n\r{x", weapon_bit_name(obj->value[4]));
send_to_char(buf, ch);
}
for ( paf = obj->affected; paf != NULL; paf = paf->next )
{
if (paf->modifier > 0)
{
sprintf( buf, "{wAffects {c%s{w by {c%d{x",
affect_loc_name( paf->location ), paf->modifier);
send_to_char(buf,ch);
}
if ( paf->duration > -1)
sprintf(buf,"{w, {c%d {whours.{x\n\r",paf->duration);
else
if(paf->modifier > 0)
sprintf(buf,"{w.{x\n\r");
send_to_char( buf, ch );
if (paf->bitvector)
{
switch(paf->where)
{
case TO_AFFECTS:
sprintf(buf,"{wAdds {c%s {waffect.{x\n",
affect_bit_name(paf->bitvector));
break;
case TO_AFFECTS2:
sprintf(buf, "{wAlso adds {c%s{w affect.{x\n",
affect2_bit_name(paf->bitvector));
break;
case TO_WEAPON:
sprintf(buf,"{wAdds {c%s {wweapon flags.{x\n",
weapon_bit_name(paf->bitvector));
break;
case TO_OBJECT:
sprintf(buf,"{wAdds {c%s {wobject flag.{x\n",
extra_bit_name(paf->bitvector));
break;
case TO_IMMUNE:
sprintf(buf,"{wAdds immunity to {c%s{w.{x\n",
imm_bit_name(paf->bitvector));
break;
case TO_RESIST:
sprintf(buf,"{wAdds resistance to {c%s{w.{x\n\r",
imm_bit_name(paf->bitvector));
break;
case TO_VULN:
sprintf(buf,"{wAdds vulnerability to {c%s{w.{x\n\r",
imm_bit_name(paf->bitvector));
break;
default:
sprintf(buf,"{wUnknown bit {c%d{w: {w%d{x\n\r",
paf->where,paf->bitvector);
break;
}
send_to_char(buf,ch);
}
}
}
else
{
send_to_char( "You can't remember a thing about it.\n\r", ch );
}
check_improve( ch, gsn_lore, FALSE, 1 );
return;
}
/*
* forced recall for when a player was accidentally trapped in a
* no recall, no teleport, type area.
* It should only be used if the imm was at fualt for the mess
* It give a message on wiznet.
*
* (c) 2000 TAKA Ghost Dancer MUD Project
* a PYROX - ribbed for her pleasure - original idea!
*
* It will only transfer them to the temple vnum nowhere else
* so i believe it safe for a low level imm.
*/
void do_frecall( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "{RForce Recall whom?{x\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
send_to_char( "{RThey aren't here.{x\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "{RNot on NPC's.{x\n\r", ch );
return;
}
if ( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "{RYou failed.{x\n\r", ch );
return;
}
sprintf(buf,"$N force recalled %s",victim->name);
wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
send_to_char( "Force Recall Done.\n\r", ch );
stop_fighting(victim,TRUE);
sprintf( buf, "%s %ld", victim->name, ROOM_VNUM_TEMPLE );
do_transfer( ch, buf);
return;
}
/*
* This is whowas for players logged off
* parts of this stolen from load_characer
*/
void do_whowas(CHAR_DATA *ch, char *argument)
{
FILE *fp;
char arg[MAX_INPUT_LENGTH];
char strsave[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char *name;
DESCRIPTOR_DATA *d;
bool found = FALSE;
char letter;
char *word;
one_argument(argument,arg);
if (arg[0] == '\0')
{
send_to_char("You must provide a name.\n\r",ch);
return;
}
name = arg;
for (d = descriptor_list; d; d = d->next)
{
CHAR_DATA *wch;
if (d->connected != CON_PLAYING || !can_see(ch,d->character))
continue;
wch = ( d->original != NULL ) ? d->original : d->character;
if ( !can_see(ch,wch) )
continue;
if (!str_prefix(arg,wch->name))
{
found = TRUE;
if ((wch->level > ch->level) && !can_see(wch, ch))
{
sprintf(buf, "{GName:{W %s %s{x\n\r", wch->name, wch->pcdata->title );
send_to_char(buf, ch);
if (wch->level >= LEVEL_IMMORTAL)
{
sprintf(buf, "{RIs an IMMORTAL.{x\n\r");
send_to_char(buf, ch);
sprintf(buf, "{GLevel:{W %d {GRace:{W %s{G Class:{W %s{x\n\r",
wch->level,
wch->ri->name,
class_table[wch->class].name);
}
else
sprintf(buf, "{GLevel:{W %d {GRace:{W %s{G Class:{W %s{x\n\r",
wch->level,
wch->ri->name,
class_table[wch->class].name);
send_to_char(buf, ch);
sprintf(buf, "{GKills Mob {W%5d{G PC {W%5d{x\n\r",
wch->pcdata->kills_mob, wch->pcdata->kills_pc);
send_to_char( buf, ch );
sprintf(buf, "{GDeaths Mob {W%5d{G PC {W%5d{x\n\r",
wch->pcdata->deaths_mob, wch->pcdata->deaths_pc);
send_to_char( buf, ch );
if (wch->pcdata->personal_name[0] != '\0'
|| wch->pcdata->personal_nickname[0] != '\0'
|| wch->pcdata->personal_email[0] != '\0'
|| wch->pcdata->personal_webaddress[0] != '\0'
|| wch->pcdata->personal_icqno[0] != '\0'
|| wch->pcdata->personal_note[0] != '\0')
send_to_char("{Y====================Personal Info======================={x\n\r", ch);
if (wch->pcdata->personal_name[0] != '\0')
printf_to_char(wch, "Name.........: %s\n\r", ch->pcdata->personal_name);
if (wch->pcdata->personal_nickname[0] != '\0')
printf_to_char(wch, "Nick Name....: %s\n\r", ch->pcdata->personal_nickname);
if (wch->pcdata->personal_email[0] != '\0')
printf_to_char(wch, "Email........: %s\n\r", ch->pcdata->personal_email);
if (wch->pcdata->personal_webaddress[0] != '\0')
printf_to_char(wch, "Web Address..: %s\n\r", ch->pcdata->personal_webaddress);
if (wch->pcdata->personal_icqno[0] != '\0')
printf_to_char(wch, "Icq#.........: %s\n\r", ch->pcdata->personal_icqno);
if (wch->pcdata->personal_note[0] != '\0')
printf_to_char(wch, "Note.........: %s\n\r", ch->pcdata->personal_note);
send_to_char("{CHistory{x\n\r", ch);
sprintf(buf, wch->pcdata->history );
send_to_char(buf, ch);
}
}
}
if (found)
{
do_whois(ch, arg);
return;
}
else
{
/* open file */
#if defined(unix)
/* decompress if .gz file exists */
sprintf( strsave, "%s%s%s", PLAYER_DIR, capitalize(name),".gz");
if ( ( fp = fopen( strsave, "r" ) ) != NULL )
{
fclose(fp);
sprintf(buf,"gzip -dfq %s",strsave);
system(buf);
}
#endif
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( name ) );
if ( ( fp = fopen( strsave, "r" ) ) != NULL ) /* open file */
{
letter = fread_letter( fp );
if ( letter == '*' )
fread_to_eol( fp );
if ( letter != '#' )
{
bug( "Do_whowas: # not found.", 0 );
return;
}
word = fread_word( fp );
if ( str_cmp( word, "PLAYER" ) )
{
bug("Bug in whowas: File opened is not Player file.",0);
fclose( fp );
return;
}
whowas(ch,fp);
fclose(fp);
}
else
{
send_to_char("There is no player by that name.\n\r",ch);
return;
}
}
}
/*
* get file information
*/
void whowas(CHAR_DATA *ch, FILE *fp)
{
char buf[MAX_STRING_LENGTH];
char *word;
bool fMatch;
char *name, *race, *date, *title, *history, *host;
char *Pname, *Pnickname, *Pemail, *Pwebaddress, *Picqno, *Pnote;
int classnum, level, sex, kills_mob, kills_pc;
int deaths_mob, deaths_pc;
long LLogT;
/* Initialize variables to Error checking states. */
name = NULL;
race = NULL;
history = NULL;
date = NULL;
title = NULL;
classnum = -1;
level = -1;
sex = -1;
deaths_mob = 0;
deaths_pc = 0;
kills_mob = 0;
kills_pc = 0;
Pname = NULL;
Pnickname = NULL;
Pnote = NULL;
Pemail = NULL;
Picqno = NULL;
Pwebaddress = NULL;
host = NULL;
for ( ; ; )
{
word = feof( fp ) ? "End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'C':
if ( !str_cmp( word, "Cla" ) )
{
classnum = fread_number(fp);
fMatch = TRUE;
break;
}
break;
case 'D':
if ( !str_cmp( word, "Deat" ))
{
deaths_mob = fread_number( fp );
deaths_pc = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'E':
if ( !str_cmp( word, "End" ) )
{
if ( (name == NULL)
||(race == NULL)
/* ||(date == NULL) */
||(sex == -1 )
||(classnum== -1 )
||(level == -1 ) )
{
send_to_char("Information not available.\n\r",ch);
return;
}
sprintf(buf, "{GName:{W %s %s{x\n\r", name, title );
send_to_char(buf, ch);
if (level >= LEVEL_IMMORTAL)
{
sprintf(buf, "{RIs an IMMORTAL.{x\n\r");
send_to_char(buf, ch);
sprintf(buf, "{GLevel:{W %d {GRace:{W %s{G Class:{W %s{x\n\r",
level, race, class_table[classnum].name);
}
else
sprintf(buf, "{GLevel:{W %d {GRace:{W %s{G Class:{W %s{x\n\r",
level, race, class_table[classnum].name);
send_to_char(buf, ch);
sprintf(buf, "{GKills Mob {W%5d{G PC {W%5d{x\n\r",
kills_mob, kills_pc);
send_to_char( buf, ch );
sprintf(buf, "{GDeaths Mob {W%5d{G PC {W%5d{x\n\r",
deaths_mob, deaths_pc);
send_to_char( buf, ch );
if (((ch->level >= LEVEL_IMMORTAL) && (ch->level >= level))
|| (level < LEVEL_IMMORTAL))
{
sprintf(buf,"{YLast seen on:{m %s{x\n\r", (char *) ctime(&LLogT));
send_to_char(buf, ch);
if(IS_IMMORTAL(ch))
{
sprintf(buf,"{YFrom host...: {m%s\n\r", host);
send_to_char(buf, ch);
}
}
if (Pname != NULL
|| Pnickname != NULL
|| Pemail != NULL
|| Pwebaddress != NULL
|| Picqno != NULL
|| Pnote != NULL)
send_to_char("{Y====================Personal Info======================={x\n\r", ch);
if (Pname != NULL)
printf_to_char(ch, "Name.........: %s\n\r", Pname);
if (Pnickname != NULL)
printf_to_char(ch, "Nick Name....: %s\n\r", Pnickname);
if (Pemail != NULL)
printf_to_char(ch, "Email........: %s\n\r", Pemail);
if (Pwebaddress != NULL)
printf_to_char(ch, "Web Address..: %s\n\r", Pwebaddress);
if (Picqno != NULL)
printf_to_char(ch, "Icq#.........: %s\n\r", Picqno);
if (Pnote != NULL)
printf_to_char(ch, "Note.........: %s\n\r", Pnote);
send_to_char("{CHistory{x\n\r", ch);
sprintf(buf, history );
send_to_char(buf, ch);
free_string(name);
free_string(race);
free_string(date);
free_string(title);
return;
}
break;
case 'K':
if ( !str_cmp( word, "Kill" ))
{
kills_mob = fread_number( fp );
kills_pc = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'L':
if ( !str_cmp(word,"Levl")
||!str_cmp(word,"Lev")
||!str_cmp(word,"Level") )
{
level = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp(word, "LogO") )
{
/* date = str_dup(fread_string( fp )); */
LLogT = fread_number(fp);
fMatch = TRUE;
break;
}
break;
case 'H':
if (!str_cmp(word,"Hist") )
{
history = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
if (!str_cmp(word,"HostN") )
{
host = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
break;
case 'N':
if (!str_cmp(word,"Name") )
{
name = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
break;
case 'P':
if (!str_cmp(word,"Pname") )
{
Pname = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
if (!str_cmp(word,"Pnick") )
{
Pnickname = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
if (!str_cmp(word,"Pemai") )
{
Pemail = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
if (!str_cmp(word,"Pweba") )
{
Pwebaddress = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
if (!str_cmp(word,"Picqn") )
{
Picqno = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
if (!str_cmp(word,"Pnote") )
{
Pnote = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
break;
case 'R':
if ( !str_cmp( word, "Race") )
{
race = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
break;
case 'S':
if ( !str_cmp( word, "Sex") )
{
sex = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'T':
if ( !str_cmp( word, "Titl") )
{
title = str_dup(fread_string( fp ));
fMatch = TRUE;
break;
}
break;
}
if ( !fMatch )
{
fread_to_eol( fp );
}
}
}
/*
* home recall selectable by character
* (c) 2000 TAKA Ghost Dancer MUD Project
*/
void do_hrecall( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int location;
argument = one_argument( argument, arg );
/*
* Check flexable options here
*/
if (USE_HOME_RECALL != 1)
{
send_to_char("This option disabled!\n\r", ch);
return;
}
if(IS_NPC(ch))
return;
if (ch->level < MIN_HOME_LEVEL)
{
sprintf(buf, "You must be level %ld or greater to use this command.\n\r", MIN_HOME_LEVEL);
send_to_char(buf, ch);
return;
}
/*
* set home location with hrecall set
*/
if ( !str_cmp( arg, "set"))
{
ch->pcdata->hrecall = ch->in_room->vnum;
send_to_char ("This is now your home recall.\n\r", ch);
return;
}
location = ch->pcdata->hrecall;
/*
* checks
* 1) not an NPC
* 2) already standing in the home recall point
* 3) not in a no recall room
* 4) not fighting
*/
if (IS_NPC(ch) && !IS_SET(ch->act,ACT_PET))
{
send_to_char("You are always home. NPC lives where they are.\n\r",ch);
return;
}
/* Be sure they are not currently home */
if (( ch->in_room->vnum == ch->pcdata->hrecall ))
{
send_to_char("{RYou are at your home recall.\n\r", ch);
return;
}
if ( IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL))
{
send_to_char( "That is impossible in a no-recall area.\n\r", ch );
return;
}
if ( ( victim = ch->fighting ) != NULL )
{
sprintf( buf, "That is not possible while fighting!.\n\r");
send_to_char( buf, ch );
return;
}
/*
* recall penalties half move
*/
ch->move /= 2;
act( "$n prays for transportation and disappears.", ch, NULL, NULL, TO_ROOM );
char_from_room( ch );
char_to_room( ch, get_room_index(location) );
act( "$n appears in the room.", ch, NULL, NULL, TO_ROOM );
send_to_char ("You return to your home recall spot.\n\r", ch);
do_look( ch, "" );
}
/*
* Allows PC to make and store a history.
* by TAKA
* (c) 2000 TAKA of the Ghost Dancer MUD Project
*/
void do_history( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
if ( argument[0] != '\0' )
{
buf[0] = '\0';
smash_tilde( argument );
if (argument[0] == '-')
{
int len;
bool found = FALSE;
if (ch->pcdata->history == NULL || ch->pcdata->history[0] == '\0')
{
send_to_char("No lines left to remove.\n\r",ch);
return;
}
strcpy(buf,ch->pcdata->history);
for (len = strlen(buf); len > 0; len--)
{
if (buf[len] == '\r')
{
if (!found) /* back it up */
{
if (len > 0)
len--;
found = TRUE;
}
else /* found the second one */
{
buf[len + 1] = '\0';
free_string(ch->pcdata->history);
ch->pcdata->history = str_dup(buf);
send_to_char( "Your history is:\n\r", ch );
page_to_char( ch->pcdata->history ? ch->pcdata->history :
"(None).\n\r", ch );
return;
}
}
}
buf[0] = '\0';
free_string(ch->pcdata->history);
ch->pcdata->history = str_dup(buf);
send_to_char("{RHistory cleared.{x\n\r",ch);
return;
}
if ( argument[0] == '+' )
{
/* if ( ch->pcdata->history != NULL )
strcat( buf, ch->pcdata->history );
argument++;
while ( isspace(*argument) )
argument++;*/
strcpy( buf, ch->pcdata->history);
strcat( buf, argument );
strcat( buf, "\n\r" );
if ( strlen(buf) >= 4096)
{
send_to_char( "History too long.\n\r", ch );
return;
}
free_string( ch->pcdata->history );
ch->pcdata->history = str_dup( buf );
send_to_char( "Your history is:\n\r", ch );
page_to_char( ch->pcdata->history ? ch->pcdata->history : "(None).\n\r", ch );
return;
}
/* argument = one_argument( argument, arg );
smash_tilde( argument );*/
if ( !str_cmp( argument, "write") )
{
if ( argument[0] == '\0' )
string_append( ch, &ch->pcdata->history );
return;
}
/* if ( strlen(buf) >= 4096)
{
send_to_char( "History too long.\n\r", ch );
return;
}
strcat( buf, argument );
strcat( buf, "\n\r" );
free_string( ch->pcdata->history );
ch->pcdata->history = str_dup( buf );*/
}
send_to_char( "Your history is:\n\r", ch );
page_to_char( ch->pcdata->history ? ch->pcdata->history : "(None).\n\r", ch );
return;
}
/*
* look at the history of an online player
*/
void do_lookhist( CHAR_DATA *ch, char *argument )
{
char arg1[MIL];
CHAR_DATA *victim;
argument = one_argument (argument, arg1);
if (arg1[0] == '\0')
{
stc ("{rWhos history do you want to read?{x\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg1)) == NULL)
{
stc ("{rThey aren't here.{x\n\r", ch);
return;
}
if(IS_NPC(victim))
{
stc("They have no player history", ch);
return;
}
stc( "Thier history is:\n\r", ch );
page_to_char( victim->pcdata->history ? victim->pcdata->history : "(None).\n\r", ch );
return;
}
/*
TAKA add skill pill
1) get chance of success number_test
2) imbue the spell embue_spell
3) do skill make pill do_mpill
TAKA add skill brew
4) do skill brew potion do_brew
*/
/* 1 */
bool number_test(int num)
{
if (number_range(1,100) <= num)
return TRUE;
else
return FALSE;
}
/* 2 embue the spell into potion of pill */
void embue_spell( int sn, int level, CHAR_DATA * ch, void *vo )
{
char buf [ MAX_STRING_LENGTH ];
OBJ_DATA *obj = ( OBJ_DATA * ) vo;
int free_slots, i, mana, class;
int snlev = 0, srate = 0;
for ( free_slots = i = 1; i <= 4; i++ )
if ( obj->value[i] != 0 )
free_slots++;
if ( free_slots > 4 )
{
act( "{R$p cannot contain any more spells.{x", ch, obj, NULL, TO_CHAR);
return;
}
mana = 40;
mana += skill_table[sn].min_mana;
if ( !IS_NPC( ch ) && ch->mana < mana )
{
send_to_char( "{RYou don't have enough mana.{x\n\r", ch );
return;
}
if ( IS_IMMORTAL(ch) )
srate = 85 + ( MAX_LEVEL - (ch->level -1));
else
srate = (100 - (free_slots * 20));
if ( number_percent() > ch->pcdata->learned[sn] )
{
send_to_char( "{RYou lost your concentration.{x\n\r", ch );
ch->mana -= mana / 2;
return;
}
ch->mana -= mana;
obj->value[free_slots] = sn;
if ( number_percent() > srate )
{
sprintf( buf, "{RThe magic enchantment has failed: the {W%s {Rvanishes.{x\n\r",
item_name( obj->item_type ) );
send_to_char( buf, ch );
obj->value[0] = -1;
return;
}
free_string( obj->short_descr );
sprintf( buf, "{Ra {W%s {Rof {G", item_name( obj->item_type ) );
for ( i = 1; i <= free_slots; i++ )
if ( obj->value[ i ] != -1 )
{
strcat( buf, skill_table[ obj->value[ i ] ].name );
( i != free_slots ) ? strcat( buf, ", " ) : strcat( buf, "{x" );
}
obj->short_descr = str_dup( buf );
sprintf( buf, "%s %s", obj->name, item_name( obj->item_type ) );
free_string( obj->name );
obj->name = str_dup( buf );
for (class = 0;class < MAX_CLASS;class++)
{
if(skill_table[sn].skill_level[class] < snlev)
{
snlev = skill_table[sn].skill_level[class];
}
}
if(obj->level < snlev) {obj->level = snlev; }
sprintf( buf, "{RYou have imbued a new spell to the %s.{x\n\r", item_name( obj->item_type ) );
send_to_char( buf, ch );
return;
}
/* 3 make a pill */
void do_mpill( CHAR_DATA * ch,char *argument )
{
OBJ_DATA *pill;
char arg1[ MAX_INPUT_LENGTH ];
char arg2[ MAX_INPUT_LENGTH ];
char arg3[ MAX_INPUT_LENGTH ];
char arg4[ MAX_INPUT_LENGTH ];
char buf[MAX_STRING_LENGTH];
int sn;
if(IS_NPC(ch))
{
send_to_char("{RYou don't have any need for pills.{x\n\r",ch);
return;
}
if(get_skill(ch,gsn_mpill) < 1)
{
send_to_char("Huh?\n\r",ch);
return;
}
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
argument = one_argument( argument, arg4 );
if ( arg1[0] == '\0' )
{
send_to_char( "{RMake a pill out of what spells?{x\n\r", ch );
send_to_char( "{G mpill {M<spell1> <spell2> <spell3> <spell4>{x\n\r", ch );
return;
}
if ( ( sn = skill_lookup( arg1 ) ) < 0 )
{
sprintf( buf, "{RYou don't know any spells by that name {W%s.{x\n\r", arg1);
send_to_char( buf, ch );
return;
}
/* check spell selections 2,3,4 */
if (( arg2[0] != '\0' ) && (( sn = skill_lookup( arg2 )) < 0 ))
{
sprintf( buf, "{RYou don't know any spells by that name {W%s.{x\n\r", arg2);
send_to_char( buf, ch );
return;
}
if (( arg3[0] != '\0' ) && (( sn = skill_lookup( arg3 )) < 0 ))
{
sprintf( buf, "{RYou don't know any spells by that name {W%s.{x\n\r", arg3);
send_to_char( buf, ch );
return;
}
if (( arg4[0] != '\0' ) && (( sn = skill_lookup( arg4 )) < 0 ))
{
sprintf( buf, "{RYou don't know any spells by that name {W%s.{x\n\r", arg4);
send_to_char( buf, ch );
return;
}
sn = skill_lookup( arg1 );
if(!number_test(get_skill(ch,sn)))
{
send_to_char("{RYou don't know that spell well enough to make a pill of it!{x\n\r",ch);
return;
}
if ( skill_table[sn].target != TAR_CHAR_DEFENSIVE
&& skill_table[sn].target != TAR_CHAR_SELF
&& skill_table[sn].target != TAR_OBJ_CHAR_DEF )
{
send_to_char( "{RYou cannot make a pill of that spell.{x\n\r", ch );
return;
}
pill = create_object( get_obj_index( OBJ_VNUM_PILL ), 0 );
pill->value[1] = 0;
pill->value[2] = 0;
pill->value[3] = 0;
pill->value[4] = 0;
if(!pill)
{
send_to_char("{RCould not find the pill object, please notify an IMP!{x\n\r",ch);
return;
}
obj_to_char(pill,ch);
send_to_char("{RYou begin focus your energy and mutter the words.{x\n\r",ch);
act( "{W$n {Rbegins focusing and chanting.{x", ch, NULL, NULL, TO_ROOM);
WAIT_STATE( ch, skill_table[ gsn_mpill ].beats );
act( "{R$p appears suddenly.{x",ch, pill, NULL, TO_CHAR);
act( "{R$p appears suddenly.{x",ch, pill, NULL, TO_ROOM);
if ( !IS_NPC( ch ) && ( number_percent( ) > ch->pcdata->learned[gsn_mpill]
|| number_percent( ) > ( ( get_curr_stat(ch,STAT_INT) - 13 ) * 5 +
( get_curr_stat(ch,STAT_WIS) - 13 ) * 3 ) ) )
{
act( "$p {Yexplodes {Rviolently{x!", ch, pill, NULL, TO_CHAR );
act( "$p {Yexplodes {Rviolently{x!", ch, pill, NULL, TO_ROOM );
extract_obj( pill );
sn = skill_lookup( "energy drain" );
damage( ch, ch, ch->max_hit / 10, sn, DAM_ENERGY, FALSE );
check_improve(ch,gsn_mpill,FALSE,1);
return;
}
pill->level = 1;
pill->value[0] = ch->level;
if ( arg1[0] != '\0' )
{
sn = skill_lookup( arg1 );
embue_spell( sn, ch->level, ch, pill );
if (pill->value[0] == -1)
{
extract_obj( pill );
return;
}
}
if ( arg2[0] != '\0' )
{
sn = skill_lookup( arg2 );
embue_spell( sn, ch->level, ch, pill );
if (pill->value[0] == -1)
{
extract_obj( pill );
return;
}
}
if ( arg3[0] != '\0' )
{
sn = skill_lookup( arg3 );
embue_spell( sn, ch->level, ch, pill );
if (pill->value[0] == -1)
{
extract_obj( pill );
return;
}
}
if ( arg4[0] != '\0' )
{
sn = skill_lookup( arg4 );
embue_spell( sn, ch->level, ch, pill );
if (pill->value[0] == -1)
{
extract_obj( pill );
return;
}
}
check_improve(ch,gsn_mpill,TRUE,1);
return;
}
/* 4 brew potion */
void do_brew( CHAR_DATA * ch,char *argument )
{
OBJ_DATA *potion;
char arg1[ MAX_INPUT_LENGTH ];
char arg2[ MAX_INPUT_LENGTH ];
char arg3[ MAX_INPUT_LENGTH ];
char arg4[ MAX_INPUT_LENGTH ];
char buf[MAX_STRING_LENGTH];
int sn;
if(IS_NPC(ch))
{
send_to_char("{RYou don't have any need for potions.{x\n\r",ch);
return;
}
if(get_skill(ch,gsn_brew) < 1)
{
send_to_char("Huh?\n\r",ch);
return;
}
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
argument = one_argument( argument, arg4 );
if ( arg1[0] == '\0' )
{
send_to_char( "{RMake a potion out of what spells?{x\n\r", ch );
send_to_char( "{G brew {M<spell1> <spell2> <spell3> <spell4>{x\n\r", ch );
return;
}
if ( ( sn = skill_lookup( arg1 ) ) < 0 )
{
sprintf( buf, "{RYou don't know any spells by that name {W%s.{x\n\r", arg1);
send_to_char( buf, ch );
return;
}
/* check spell selections 2,3,4 */
if (( arg2[0] != '\0' ) && (( sn = skill_lookup( arg2 )) < 0 ))
{
sprintf( buf, "{RYou don't know any spells by that name {W%s.{x\n\r", arg2);
send_to_char( buf, ch );
return;
}
if (( arg3[0] != '\0' ) && (( sn = skill_lookup( arg3 )) < 0 ))
{
sprintf( buf, "{RYou don't know any spells by that name {W%s.{x\n\r", arg3);
send_to_char( buf, ch );
return;
}
if (( arg4[0] != '\0' ) && (( sn = skill_lookup( arg4 )) < 0 ))
{
sprintf( buf, "{RYou don't know any spells by that name {W%s.{x\n\r", arg4);
send_to_char( buf, ch );
return;
}
sn = skill_lookup( arg1 );
if(!number_test(get_skill(ch,sn)))
{
send_to_char("{RYou don't know that spell well enough to make a potion of it!{x\n\r",ch);
return;
}
if ( skill_table[sn].target != TAR_CHAR_DEFENSIVE
&& skill_table[sn].target != TAR_CHAR_SELF
&& skill_table[sn].target != TAR_OBJ_CHAR_DEF )
{
send_to_char( "{RYou cannot make a potion of that spell.{x\n\r", ch );
return;
}
potion = create_object( get_obj_index( OBJ_VNUM_POTION ), 0 );
potion->value[1] = 0;
potion->value[2] = 0;
potion->value[3] = 0;
potion->value[4] = 0;
if(!potion)
{
send_to_char("{RCould not find the potion object, please notify an IMP!{x\n\r",ch);
return;
}
obj_to_char(potion,ch);
send_to_char("{RYou begin focus your energy and mutter the words.{x\n\r",ch);
act( "{W$n {Rbegins focusing and chanting.{x", ch, NULL, NULL, TO_ROOM);
WAIT_STATE( ch, skill_table[ gsn_brew ].beats );
act( "{R$p appears suddenly.{x",ch, potion, NULL, TO_CHAR);
act( "{R$p appears suddenly.{x",ch, potion, NULL, TO_ROOM);
if ( !IS_NPC( ch ) && ( number_percent( ) > ch->pcdata->learned[gsn_mpill]
|| number_percent( ) > ( ( get_curr_stat(ch,STAT_INT) - 13 ) * 5 +
( get_curr_stat(ch,STAT_WIS) - 13 ) * 3 ) ) )
{
act( "$p {Yexplodes {Rviolently{x!", ch, potion, NULL, TO_CHAR );
act( "$p {Yexplodes {Rviolently{x!", ch, potion, NULL, TO_ROOM );
extract_obj( potion );
sn = skill_lookup( "energy drain" );
damage( ch, ch, ch->max_hit / 10, sn, DAM_ENERGY, FALSE );
check_improve(ch,gsn_brew,FALSE,1);
return;
}
potion->level = 1;
potion->value[0] = ch->level;
if ( arg1[0] != '\0' )
{
sn = skill_lookup( arg1 );
embue_spell( sn, ch->level, ch, potion );
if (potion->value[0] == -1)
{
extract_obj( potion );
return;
}
}
if ( arg2[0] != '\0' )
{
sn = skill_lookup( arg2 );
embue_spell( sn, ch->level, ch, potion );
if (potion->value[0] == -1)
{
extract_obj( potion );
return;
}
}
if ( arg3[0] != '\0' )
{
sn = skill_lookup( arg3 );
embue_spell( sn, ch->level, ch, potion );
if (potion->value[0] == -1)
{
extract_obj( potion );
return;
}
}
if ( arg4[0] != '\0' )
{
sn = skill_lookup( arg4 );
embue_spell( sn, ch->level, ch, potion );
if (potion->value[0] == -1)
{
extract_obj( potion );
return;
}
}
check_improve(ch,gsn_brew,TRUE,1);
return;
}
/* End make pill & brew TAKA */
/*
* score and effects commands by TAKA!
* of the ROFT and Ghost Dancer mud projects!
*/
void do_mortscore( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_STRING_LENGTH];
CHAR_DATA *victim;
int sIndex;
if (IS_NPC(ch))
return;
one_argument(argument,arg);
if ( arg[0] == '\0' )
{
send_to_char( "{RList score sheet for whom?{x\n\r", ch );
return;
}
if ( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "{RThey aren't here.{x\n\r", ch );
return;
}
if (IS_NPC(victim))
{
send_to_char( "{RUse this for score sheets on players.{x\n\r", ch );
return;
}
/*
Reformated score screen by TAKA or Ghost Dancers Mud
*/
send_to_char("{Y======================================================================{x\n\r", ch );
sprintf(buf, "{Y| {GYou are: {W%-12s %-20s {GAge: {W%-4d {x\n\r",
victim->name, IS_NPC(victim) ? "" : victim->pcdata->title, get_age(victim) );
send_to_char( buf, ch );
sprintf(buf, "{Y| {GLevel: {W%3d {GRace: {W%-10s {GClass: {W%-10s {GSex: {W%-7s {x\n\r",
victim->level,victim->ri->name,
IS_NPC(victim) ? "mobile" : class_table[victim->class].name,
victim->sex == 0 ? "sexless" : victim->sex == 1 ? "male" : "female" );
send_to_char( buf, ch );
sprintf(buf, "{Y| {GYou are: {W%s Your spouse is: {W%s {GYour deity is {C%s{x\n\r",
victim->pcdata->spouse[0] == '\0' ? "single" : "married",
victim->pcdata->spouse, deity_table[victim->pcdata->deity].name );
send_to_char( buf, ch );
send_to_char("{Y======================================================================{x\n\r", ch );
sprintf(buf, "{Y| {WCurrent{G/{WMaximum {GPierce: {W%-5d {x\n\r",
GET_AC(victim,AC_PIERCE));
send_to_char( buf, ch );
sprintf(buf, "{Y| {GHit Points {R%6d{G/{W%-6d {GBash: {W%-5d {x\n\r",
victim->hit, victim->max_hit, GET_AC(victim,AC_BASH));
send_to_char( buf, ch );
sprintf(buf, "{Y| {GMana Points {R%6d{G/{W%-6d {GSlash: {W%-5d {x\n\r",
victim->mana, victim->max_mana, GET_AC(victim,AC_SLASH));
send_to_char( buf, ch );
sprintf(buf, "{Y| {GMove Points {R%6d{G/{W%-6d {GMagic: {W%-5d {x\n\r",
victim->move, victim->max_move, GET_AC(victim,AC_EXOTIC));
send_to_char( buf, ch );
send_to_char("{Y======================================================================{x\n\r", ch );
send_to_char("{Y| {G--Stats-- {R--Fighting-- {Y--Money-- {x\n\r", ch);
sprintf(buf, "{Y| {GStr {W%2d{G({M%2d{G) Hit {R%-5d {GGold {y%-9ld {x\n\r",
victim->perm_stat[STAT_STR], get_curr_stat(victim,STAT_STR), GET_HITROLL(victim),
victim->gold);
send_to_char( buf, ch );
sprintf(buf, "{Y| {GInt {W%2d{G({M%2d{G) Damage {R%-5d {GSilver {D%-9ld {x\n\r",
victim->perm_stat[STAT_INT], get_curr_stat(victim,STAT_INT), GET_DAMROLL(victim),
victim->silver);
send_to_char( buf, ch );
sprintf(buf, "{Y| {GWis {W%2d{G({M%2d{G) Wimpy {m%-5d {G {x\n\r",
victim->perm_stat[STAT_WIS], get_curr_stat(victim,STAT_WIS), victim->wimpy);
send_to_char( buf, ch );
sprintf(buf, "{Y| {GDex {W%2d{G({M%2d{G) {c-Pra/Tra- {G-Carry- {x\n\r",
victim->perm_stat[STAT_DEX], get_curr_stat(victim,STAT_DEX));
send_to_char( buf, ch );
sprintf(buf, "{Y| {GCon {W%2d{G({M%2d{G) Practice {c%-4d {GItem {W%8d{G({W%8d{G) {x\n\r",
victim->perm_stat[STAT_CON], get_curr_stat(victim,STAT_CON), victim->practice,
victim->carry_number, can_carry_n(victim));
send_to_char( buf, ch );
sprintf(buf, "{Y| {GTrains {c%-4d {GWeight {W%8ld{G({W%8d{G) {x\n\r",
victim->train, get_carry_weight(victim) / 10, can_carry_w(victim) /10 );
send_to_char( buf, ch );
send_to_char("{Y======================================================================{x\n\r", ch );
sprintf(buf, "{Y| {GKills Mob {W%5d{G PC {W%5d{x\n\r",
victim->pcdata->kills_mob, victim->pcdata->kills_pc);
send_to_char( buf, ch );
sprintf(buf, "{Y| {GDeaths Mob {W%5d{G PC {W%5d{x\n\r",
victim->pcdata->deaths_mob, victim->pcdata->deaths_pc);
send_to_char( buf, ch );
sprintf(buf, "{Y| {GYou have earned: {W%-9d {GExp Alignment: {W%-4d ",
victim->exp, victim->alignment);
send_to_char( buf, ch );
if ( victim->alignment > 900 ) send_to_char("{Wangelic. {x\n\r", ch);
else if ( victim->alignment > 700 ) send_to_char("{wsaintly. {x\n\r", ch);
else if ( victim->alignment > 350 ) send_to_char("{Ygood. {x\n\r", ch);
else if ( victim->alignment > 100 ) send_to_char("{Ckind. {x\n\r", ch);
else if ( victim->alignment > -100 ) send_to_char("{Mneutral. {x\n\r", ch);
else if ( victim->alignment > -350 ) send_to_char("{Dmean. {x\n\r", ch);
else if ( victim->alignment > -700 ) send_to_char("{yevil. {x\n\r", ch);
else if ( victim->alignment > -900 ) send_to_char("{rdemonic. {x\n\r", ch);
else send_to_char("{Rsatanic. {x\n\r", ch);
sprintf(buf, "{Y| {GYou need per/lv: {W%-9d {GExp Hours Played: {B%-7d {x\n\r",
exp_per_level(victim,victim->pcdata->points), ( victim->played + (int) (current_time - victim->logon) ) / 3600);
send_to_char( buf, ch );
sprintf(buf, "{Y| {GTill next level: {W%-9d {GExp {x\n\r",
((victim->level + 1) * exp_per_level(victim,victim->pcdata->points) - victim->exp));
send_to_char( buf, ch );
send_to_char("{Y======================================================================{x\n\r", ch );
sprintf( buf, "{GYou have {y%ld gold {Gand {D%ld silver{G in the bank.{x\n\r",
victim->pcdata->balance, victim->pcdata->sbalance);
send_to_char( buf, ch );
for(sIndex = 1; sIndex <= NO_SHARES; sIndex++)
{
if ( victim->pcdata->shares[sIndex] )
{
sprintf(buf,"{GYou have {y%d gold {Ginvested in {M%d {Gtype %d shares {C({W%d {Geach{C){G.{x\n\r",
(victim->pcdata->shares[sIndex] * share_value[sIndex]), victim->pcdata->shares[sIndex],
sIndex, share_value[sIndex]);
send_to_char( buf, ch );
}
}
send_to_char("{Y======================================================================{x\n\r", ch );
switch ( victim->position )
{
case POS_DEAD:
send_to_char( "{MYou are DEAD!! ", ch );
break;
case POS_MORTAL:
send_to_char( "{MYou are mortally wounded.", ch );
break;
case POS_INCAP:
send_to_char( "{MYou are incapacitated. ", ch );
break;
case POS_STUNNED:
send_to_char( "{MYou are stunned. ", ch );
break;
case POS_SLEEPING:
send_to_char( "{MYou are sleeping. ", ch );
break;
case POS_RESTING:
send_to_char( "{MYou are resting. ", ch );
break;
case POS_SITTING:
send_to_char( "{MYou are sitting. ", ch );
break;
case POS_STANDING:
send_to_char( "{MYou are standing. ", ch );
break;
case POS_FIGHTING:
send_to_char( "{MYou are fighting. ", ch );
break;
}
if ( !IS_NPC(victim) && victim->pcdata->condition[COND_DRUNK] > 10 )
send_to_char( "{Ddrunk. ", ch );
else
send_to_char( "{D . ", ch );
if ( !IS_NPC(victim) && victim->pcdata->condition[COND_THIRST] == 0 )
send_to_char( "{Gthirsty. ", ch );
else
send_to_char( "{D . ", ch );
if ( !IS_NPC(victim) && victim->pcdata->condition[COND_HUNGER] == 0 )
send_to_char( "{Rhungry. ", ch );
else
send_to_char( "{D . ", ch );
send_to_char("{x\n\r", ch);
/* RT wizinvis and holy light */
if ( IS_IMMORTAL(victim))
{
send_to_char("{YHoly Light: ",ch);
if (IS_SET(victim->act,PLR_HOLYLIGHT))
send_to_char("{Won",ch);
else
send_to_char("{Doff",ch);
if (victim->invis_level)
{
sprintf( buf, " {YInvisible: level {W%d",victim->invis_level);
send_to_char(buf,ch);
}
if (victim->incog_level)
{
sprintf(buf," {YIncognito: level {W%d",victim->incog_level);
send_to_char(buf,ch);
}
send_to_char("\n\r",ch);
}
}
/*
* Paintball wars game by Taka of Ghost Dancer MUD
* (c) 2000 Taka and the GhostMud Project Team
* Idea by Leesy and consultation by Leesy and Vincent to bring
* you this snippet
*/
/* start the paintball war */
void do_strpbwar args( ( CHAR_DATA *ch, char *argument ) )
{
char buf[MSL];
int timer;
chWar = ch;
/* validate this mud allows for paintball wars */
if(!ALLOW_PB_WARS)
{
send_to_char("{RThis MUD does not allow paintball wars!{x\n\r", ch);
return;
}
/* validate war in progress */
if(PB_WAR_INPROGRESS)
{
send_to_char("{RThere is already a war in progress!{x\n\r", ch);
return;
}
timer = atoi(argument);
sprintf(buf, "{GA paintball war has been initiated you have {B%ld {Gtick to join it!{x\n\r",
PB_JOIN_TICKS);
do_echo(ch, buf);
PB_WAR_INPROGRESS = TRUE;
PB_TICKS_TO_JOIN = PB_JOIN_TICKS;
PB_WAR_TIMER = timer;
NO_COMBATANTS = 0;
FIRST_WAR = 1;
/* if timer for war is 0 then use default defined */
if(timer == 0)
PB_WAR_TIMER = DEFAULT_PB_TIMER;
return;
}
/* join the paintball war */
void do_joinpbwar args( ( CHAR_DATA *ch, char *argument ) )
{
char buf[MSL];
/* validate war in progress */
if(!PB_WAR_INPROGRESS)
{
send_to_char("{RThere NO war in progress!{x\n\r", ch);
return;
}
/* check if mobile tryies to join and disallow */
if(IS_NPC(ch))
{
send_to_char("But you are a mobile what do you care for the affairs of mortals!\n", ch);
return;
}
/* stop double and triple joining */
if(ch->pcdata->char_in_pb_war)
{
send_to_char("{RYou are already involved in the war!{x\n\r", ch);
return;
}
/* check maximum combatants */
if(NO_COMBATANTS > MAX_COMBATANTS)
{
send_to_char("{RSorry maximum number of combatants already playing!{x\n\r", ch);
return;
}
/* make sure we are in the join phase */
if(PB_TICKS_TO_JOIN <= 0)
{
send_to_char("{RSorry the war is in progress already you are too late!{x\n\r", ch);
return;
}
/* not allow npcs to enter */
if IS_NPC(ch)
{
send_to_char("{RShooting MOBS: {YCanon fooder is not permitted!{x\n\r", ch);
return;
}
sprintf(buf, "{W%s {Ghas joined the paintball war.{x\n\r", ch->name);
do_echo(ch, buf);
ch->pcdata->char_in_pb_war = TRUE;
ch->pcdata->combatant_number = NO_COMBATANTS;
/* if we use shoot limiting then set the number to the limit
* else set the number to -1 for unlimited */
if(RELOAD_OPTION_ON)
ch->pcdata->number_shoots = NO_SHOOTS;
else
ch->pcdata->number_shoots = -1;
NO_COMBATANTS += 1;
/* save name in slot */
strcpy(COMBAT_TABLE[ch->pcdata->combatant_number].name, ch->name);
return;
}
/* player A shoots at player B */
void do_shoot args( ( CHAR_DATA *ch, char *argument ) )
{
char buf[MSL];
char arg[MIL];
CHAR_DATA *victim;
one_argument( argument, arg );
/* check if a war is in progess */
if(!PB_WAR_INPROGRESS)
{
send_to_char("{RThere is no war inprogress!{x\n\r", ch);
return;
}
/* see if character is participating in the war */
if ( ch->pcdata->char_in_pb_war != TRUE)
{
send_to_char( "{RYou are not even joined in the war.{x\n\r", ch );
return;
}
/* see if victim is in the world */
if ( ( victim = get_char_room( ch, NULL, arg ) ) == NULL )
{
send_to_char( "{RThey aren't here.{x\n\r", ch );
return;
}
/* check if is NPC */
if(IS_NPC(victim))
{
send_to_char( "{RMobiles do not fight wars!{x\n\r", ch );
return;
}
/* insure war is actually started */
if(PB_TICKS_TO_JOIN != -1)
{
send_to_char("{RYou can not shoot now:{x {YThe war is in the join phase!{x\n\r", ch);
send_to_char("{GWait for the war to start first!{x\n\r", ch);
return;
}
/* a shoot was made subtract the counter here */
if(RELOAD_OPTION_ON)
{
if(ch->pcdata->number_shoots == 0)
{
send_to_char("{RYou are out of bullets! You MUST reload", ch);
return;
}
ch->pcdata->number_shoots -= 1;
}
/* check if victim is involved in the war */
/* do not allow none players in the war to be shoot */
if(!victim->pcdata->char_in_pb_war)
{
send_to_char("{RWARNING: {YThey are a civilian in this war!{x\n\r", ch);
return;
}
/* check if you have already shoot this victim */
if(COMBAT_TABLE[ch->pcdata->combatant_number].kill[victim->pcdata->combatant_number] == '1')
{
sprintf(buf, "{RYou already killed {W%s{R!{x\n\r", victim->name);
send_to_char(buf, ch);
return;
}
/* check if you have already been shoot by this victim */
if(COMBAT_TABLE[ch->pcdata->combatant_number].kill[victim->pcdata->combatant_number] == '2')
{
sprintf(buf, "{DYou have been killed by {W%s {Dalready!{x\n\r", victim->name);
send_to_char(buf, ch);
return;
}
if(number_percent() > PCT_HIT_SHOOT)
{
/* send missed message */
act ("{G{YYou missed {W$N{Y as $E skillfully dodges your paintball!{x", ch, NULL, victim, TO_CHAR);
act ("{YA paintball zings by your head! {W$n {Ydives behind cover!{x", ch, NULL, victim, TO_VICT);
act ("{YA paintball zings by {W$N {Yjust missing $S head!{x", ch, NULL, victim, TO_NOTVICT);
}
else
{
/* update kill counter */
act ("{GYou {Rshoot {W$N {Gwith paint!{x", ch, NULL, victim, TO_CHAR);
act ("{GYou were {Rshoot {Gby {W$n {Gwith paint!{x", ch, NULL, victim, TO_VICT);
act ("{W$n {Ghas {Rshot {W$N {Gwith paint!{x", ch, NULL, victim, TO_NOTVICT);
COMBAT_TABLE[ch->pcdata->combatant_number].kill[victim->pcdata->combatant_number] = '1';
COMBAT_TABLE[victim->pcdata->combatant_number].kill[ch->pcdata->combatant_number] = '2';
}
return;
}
/* paintball war status */
void do_pbwarstat args( ( CHAR_DATA *ch, char *argument ) )
{
char buf[MSL];
int CIndex;
/* Check if war is inprocess */
if(!PB_WAR_INPROGRESS)
{
send_to_char("{RThere is no war inprogress!{x\n\r", ch);
return;
}
/* display join status */
if(PB_TICKS_TO_JOIN <= -1)
{
sprintf(buf, "{cThe war is in progress with {Y%d {cticks remaining in play!{x\n\r",
PB_WAR_TIMER);
send_to_char(buf, ch);
}
else
{
sprintf(buf, "{GThere are {B%d {Gticks left to join the paintball war!{x\n\r", PB_TICKS_TO_JOIN + 1);
send_to_char(buf, ch);
}
sprintf(buf, "{GThere are {M%d {Gcombatants enrolled of {r%d {Gavailable slots.{x\n\r", NO_COMBATANTS, MAX_COMBATANTS);
send_to_char(buf, ch);
send_to_char("{C## {WName {GOpen {RKill {DDead{x\n\r", ch);
for(CIndex = 0; CIndex <= (NO_COMBATANTS - 1); CIndex++)
{
int Open = 0, Kill = 0, Dead = 0, CIndex2;
for(CIndex2 = 0; CIndex2 <= (MAX_COMBATANTS - 1); CIndex2++)
{
if(COMBAT_TABLE[CIndex].kill[CIndex2] == '2')
Dead += 1;
else if(COMBAT_TABLE[CIndex].kill[CIndex2] == '1')
Kill += 1;
else
Open += 1;
}
sprintf(buf, "{C%2d {W%-10s {G%2d {R%2d {D%2d{x ",
CIndex + 1, COMBAT_TABLE[CIndex].name, Open, Kill, Dead);
send_to_char(buf, ch);
send_to_char("\n\r", ch);
}
send_to_char("{GEnd of paintball war status!{x\n\r", ch);
return;
}
/* end the paintball war */
void do_endpbwar args( ( CHAR_DATA *ch, char *argument ) )
{
int ClrIndex;
CHAR_DATA *vch;
DESCRIPTOR_DATA *d;
/* validate this mud allows for paintball wars */
if(!ALLOW_PB_WARS)
{
send_to_char("{RThis MUD does not allow paintball wars!{x\n\r", ch);
return;
}
/* validate war in progress */
if(PB_WAR_INPROGRESS)
{
send_to_char("{GThe war has been ended!{x\n\r", ch);
do_echo(ch, "{GThe paintball war has been ended!{x\n\r");
PB_WAR_INPROGRESS = FALSE;
FIRST_WAR = 0;
for(ClrIndex = 0; ClrIndex <= MAX_COMBATANTS; ClrIndex++)
{
if(COMBAT_TABLE[ClrIndex].name[0] != '\0')
COMBAT_TABLE[ClrIndex].name[0] = '\0';
}
for ( d = descriptor_list; d; d = d->next )
{
vch = d->character;
vch->pcdata->char_in_pb_war = FALSE;
vch->pcdata->combatant_number = 0;
vch->pcdata->number_shoots = 0;
}
return;
}
send_to_char("{RNo war in progress to end!{x\n\r", ch);
return;
}
/* exit the player from the paintball war */
void do_exitpbwar args( ( CHAR_DATA *ch, char *argument ) )
{
char buf[MIL];
/* validate this mud allows for paintball wars */
if(!ALLOW_PB_WARS)
{
send_to_char("{RThis MUD does not allow paintball wars!{x\n\r", ch);
return;
}
/* if war is in progress continue */
if(PB_WAR_INPROGRESS)
{
/* if player is NOT involved in the war continue */
if(!ch->pcdata->char_in_pb_war)
{
send_to_char("{RYou are not involved in this conflict!{x", ch);
return;
}
COMBAT_TABLE[ch->pcdata->combatant_number].name[0] = '\0';
ch->pcdata->combatant_number = 0;
ch->pcdata->char_in_pb_war = FALSE;
ch->pcdata->number_shoots = 0;
send_to_char("{GThe war has been ended for you!{x\n\r", ch);
sprintf(buf, "{W%s {Ghas just quit the war!{x", ch->name);
do_echo(ch, buf);
return;
}
send_to_char("{RNo war in progress to exit from!{x\n\r", ch);
return;
}
/* reload the paintball gun */
void do_reload args( ( CHAR_DATA *ch, char *argument ) )
{
/* validate this mud allows for paintball wars */
if(!ALLOW_PB_WARS)
{
send_to_char("{RThis MUD does not allow paintball wars!{x\n\r", ch);
return;
}
/* if war is in progress continue */
if(PB_WAR_INPROGRESS)
{
/* if player is NOT involved in the war continue */
if(!ch->pcdata->char_in_pb_war)
{
send_to_char("{RYou are not involved in this conflict!{x", ch);
return;
}
ch->pcdata->number_shoots = NO_SHOOTS;
act ("{GYou reload your weapon.{x", ch, NULL, NULL, TO_CHAR);
act ("{W$n {Gis reloading $s weapon.{x", ch, NULL, NULL, TO_ROOM);
/* reload penalty */
WAIT_STATE(ch, (short) RELOAD_LAG);
return;
}
send_to_char("{RNo war in progress! So there is no need to reload!{x\n\r", ch);
return;
}
/* end of paintball war code Taka */
/* memory debugging by Taka */
void do_ondebug args( ( CHAR_DATA *ch, char *argument ) )
{
DEBUG_STATE = DEBUG_ON;
return;
}
void do_offdebug args( ( CHAR_DATA *ch, char *argument ) )
{
DEBUG_STATE = DEBUG_OFF;
return;
}
/* end of memory debugging Taka */
/* 1109A */
/* Taka added area reset */
void do_areset args( ( CHAR_DATA *ch, char *argument ) )
{
char buf[MSL];
char arg[MIL];
int number;
AREA_DATA *pArea;
one_argument( argument, arg );
number = atoi(arg);
for ( pArea = area_first; pArea != NULL; pArea = pArea->next )
{
ROOM_INDEX_DATA *pRoomIndex;
if(pArea->vnum == number)
{
pArea->age = 999;
sprintf(buf, "{MArea {W%s {Mis being reset!{x\n\r", pArea->name);
send_to_char(buf, ch);
reset_area( pArea );
sprintf(buf,"{W%s {Ghas just been reset!{x\n\r",pArea->name);
wiznet(buf,NULL,NULL,WIZ_RESETS,0,0);
pArea->age = number_range( 0, 3 );
pRoomIndex = get_room_index( ROOM_VNUM_SCHOOL );
if ( pRoomIndex != NULL && pArea == pRoomIndex->area )
pArea->age = 15 - 2;
else if (pArea->nplayer == 0)
pArea->empty = TRUE;
}
}
return;
}
/* 1129A Taka Custom Restore Message for immortals */
void set_restore_message (CHAR_DATA * ch, char *rstmsg)
{
char buf[MAX_STRING_LENGTH];
if (IS_NPC (ch))
{
bug ("{GSet_restore_message: {YNPC{G.{x", 0);
return;
}
strcpy (buf, rstmsg);
free_string (ch->pcdata->rstmsg);
ch->pcdata->rstmsg = str_dup (buf);
return;
}
void do_rstmsg (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if (argument[0] == '\0')
{
printf_to_char (ch, "{wYour restore message is:{x\n\r %s\n\r", ch->pcdata->rstmsg);
return;
}
if (strlen (argument) > 256)
argument[256] = '\0';
smash_tilde (argument);
set_restore_message (ch, argument);
printf_to_char (ch, "{GRestore message changed to:{x\n\r %s\n\r", ch->pcdata->rstmsg);
}
/* End 1129A Taka Custom Restore Message */
/* 1201A Taka Windows code */
void window( CHAR_DATA *ch, OBJ_DATA *obj )
{
char buf[MSL];
ROOM_INDEX_DATA *window;
if ( obj->value[0] == 0 )
{
sprintf(buf, "%s\n\r", obj->description );
send_to_char(buf, ch);
return;
}
window = get_room_index( obj->value[0] );
if ( !window )
{
send_to_char( "A window error! Please report it!\n\r", ch );
bug( "Window %d error!", obj->pIndexData->vnum );
return;
}
if ( !IS_NPC(ch) )
{
/* show room on other side */
printf_to_char(ch,
"{GGazing through the %s you see:\n\r{C%s{x",
obj->short_descr, window->name);
if (IS_SET (ch->act, PLR_HOLYLIGHT))
{
sprintf (buf, "{r [{RRoom %ld{r]{x", window->vnum);
send_to_char (buf, ch);
}
send_to_char ("\n\r {S", ch);
send_to_char (window->description, ch);
send_to_char ("{x", ch);
if (!IS_NPC (ch) && IS_SET (ch->act, PLR_AUTOEXIT))
{
send_to_char ("\n\r", ch);
do_exits(ch, "auto");
}
/* show people and objects in window room */
show_list_to_char( window->contents, ch, FALSE, FALSE, 0, FALSE, TRUE );
show_char_to_char( window->people, ch );
return;
}
return;
}
/*
* list the equipment and/or inventory from a target player
* by taka of ghost dancer mud and the GhostMUD project
*/
void do_list_inv( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
bool found;
char arg1[MSL];
char arg2[MSL];
int iWear;
bool fAll;
argument = one_argument( argument, arg1 );
one_argument( argument, arg2 );
found = FALSE;
fAll = FALSE;
if (arg1[0] == '\0' || arg2[0] == '\0')
{
send_to_char("{RSyntax: {Blistinv {WName {M<equipment>{x\n\r", ch);
send_to_char(" {Blistinv {WName {M<inventory>{x\n\r", ch);
send_to_char(" {Blistinv {WName {M<all>{x\n\r", ch);
return;
}
if (!(victim = get_char_world(ch, arg1)))
{
send_to_char("{RThey are not here!{x\n\r", ch);
return;
}
if (!str_cmp(arg2, "all"))
fAll = TRUE;
if (!str_prefix(arg2, "equipment") || fAll)
{
for (iWear = 0; iWear < MAX_WEAR; iWear++)
{
if ((obj = get_eq_char(victim, iWear)))
{
if (!found)
{
send_to_char("\n\r", ch);
act("{W$N {Gis using:{x\n\r", ch, NULL, victim, TO_CHAR);
found = TRUE;
}
printf_to_char(ch, "{C%s{x%s{x\n\r",
where_name[iWear], format_obj_to_char(obj,ch,TRUE));
}
}
}
if (!str_prefix(arg2, "inventory") || fAll)
{
act("\n\r{W$N {Gis carrying:{x\n\r", ch, NULL, victim, TO_CHAR);
show_list_to_char(victim->carrying, ch, TRUE, TRUE, 0, TRUE, TRUE);
}
return;
}
/*
* format a string to a length
* by TAKA of GhostMUD project
*/
char * format_str_len(char * string, int length, int align)
{
char buf[MSL];
char buf2[MSL];
char *new_string;
char *count_string;
char temp;
int count = 0, nCount = 0;
int pos = 0;
new_string = buf;
count_string = buf2;
strcpy(buf2, string);
/* get count for alignment */
while( *count_string && nCount != length )
{
temp = *count_string++;
if (temp == '{' )
{
temp = *count_string++;
if (temp == '{')
nCount++;
continue;
}
nCount++;
}
/* force alignment of text to the right */
if(align == ALIGN_RIGHT)
{
count = (length - ++nCount);
while(nCount++ <= length)
{
buf[pos++] = ' ';
}
}
/* force alignment of text to the center */
if(align == ALIGN_CENTER)
{
nCount = (length - nCount) / 2;
count = nCount;
while(nCount-- > 0)
{
buf[pos++] = ' ';
}
}
/* add to buffer */
while( *string && count != length )
{
temp = *string++;
buf[pos++] = temp;
if (temp == '{' )
{
buf[pos] = *string++;
if (buf[pos] == '{')
count++;
pos++;
continue;
}
count++;
}
/* pad remaining space with blanks */
while (count++ < length)
buf[pos++] = ' ';
buf[pos] = '\0';
return (new_string);
}
/*
Idea for this by Achacai of Ghost Dancer
Coded by Taka of the GhostMUD project Team
*/
void do_show_stats( CHAR_DATA *ch, char *argument )
{
/* mobiles can not use this command */
if (IS_NPC (ch))
return;
printf_to_char(ch, "\n\r{GYours Stats are:{x\n\r");
printf_to_char(ch, "{WCurrent: {DStr {W%2d{C({W%2d{C) {DInt {W%2d{C({W%2d{C) {DWis {W%2d{C({W%2d{C) {DDex {W%2d{C({W%2d{C) {DCon {W%2d{C({W%2d{C){x\n\r",
ch->perm_stat[STAT_STR], get_curr_stat(ch,STAT_STR),
ch->perm_stat[STAT_INT], get_curr_stat(ch,STAT_INT),
ch->perm_stat[STAT_WIS], get_curr_stat(ch,STAT_WIS),
ch->perm_stat[STAT_DEX], get_curr_stat(ch,STAT_DEX),
ch->perm_stat[STAT_CON], get_curr_stat(ch,STAT_CON));
printf_to_char(ch, "{WMaximum: {DStr {W%2d{C({W%2d{C) {DInt {W%2d{C({W%2d{C) {DWis {W%2d{C({W%2d{C) {DDex {W%2d{C({W%2d{C) {DCon {W%2d{C({W%2d{C){x\n\r",
get_max_train(ch,STAT_STR), get_max_train(ch,STAT_STR)+4,
get_max_train(ch,STAT_INT), get_max_train(ch,STAT_INT)+4,
get_max_train(ch,STAT_WIS), get_max_train(ch,STAT_WIS)+4,
get_max_train(ch,STAT_DEX), get_max_train(ch,STAT_DEX)+4,
get_max_train(ch,STAT_CON), get_max_train(ch,STAT_CON)+4);
printf_to_char(ch, "\n\r");
return;
}
/*
* 1214 WHOTITL
* (c) 2000-2001 Taka * Who Title for immortals
*
* Allow Immortals to set a Who Title which shows in place of
* the Level, Race, Class Information.
*/
void set_who_title (CHAR_DATA * ch, char *whotitle)
{
char buf[MAX_STRING_LENGTH];
char const *FmtString;
if (IS_NPC (ch))
{
bug ("{GSet_who_title: {YNPC{G.{x", 0);
return;
}
FmtString = format_str_len(whotitle, 14, ALIGN_CENTER);
strcpy (buf, FmtString);
free_string (ch->pcdata->whotitl);
ch->pcdata->whotitl = str_dup (buf);
return;
}
void do_whotitl (CHAR_DATA * ch, char *argument)
{
if (IS_NPC (ch))
return;
if(!USE_IMMORTAL_CUSTOM_TITLES)
{
send_to_char("{RThat function is not supported on this mud!{x", ch);
return;
}
if (argument[0] == '\0')
{
printf_to_char (ch, "{wYour who title is:{x\n\r %s\n\r", ch->pcdata->whotitl);
return;
}
if (strlen (argument) > 256)
argument[256] = '\0';
smash_tilde (argument);
set_who_title (ch, argument);
printf_to_char (ch, "{GWho title changed to:{x\n\r %s\n\r", ch->pcdata->whotitl);
}
/* End 1214 Taka Custom Who Titles for Immortals */
/*
* (c) TAKA 2000
* Clear Affects from a mob or player
* 010201
*/
void do_clear_aff(CHAR_DATA *ch, char *argument)
{
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
int sn;
char arg1[MIL];
char arg2[MIL];
char arg3[MIL];
char buf[MSL];
argument = one_argument( argument, arg1);
argument = one_argument( argument, arg2);
argument = one_argument( argument, arg3);
/*
* validate command
*/
if ( arg1[0] == '\0' )
{
send_to_char("{RClear affects type?{x\n\r", ch);
send_to_char("{RSyntax: {wclearaff MOB <Mobile name> <affect|all>", ch);
send_to_char(" OBJ <Object name> <all>", ch);
send_to_char(" CHR <Char name> <affect|all>", ch);
return;
}
/*
* strip affect(s) from a mobile of a character
*/
if(!str_prefix(arg1, "mob")
|| !str_prefix(arg1, "chr"))
{
/* victim name */
CHAR_DATA *victim;
/* no name entered */
if ( arg2[0] == '\0' )
{
send_to_char("{RClear affects from whom?{x\n\r", ch);
return;
}
/* find victim */
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "{Rhat person or mob is not here.{x\n\r",ch);
return;
}
/* check trust levels */
if ( !IS_NPC(victim) && get_trust( victim ) > get_trust( ch ) )
{
printf_to_char(victim, "{W%s {Rhas tried to strip your affects!{x\n\r", ch->name);
send_to_char("{RNot on your life!{x\n\r", ch);
return;
}
/* check if clear all */
if ( ( !str_cmp( arg3, "all" ) ) || (arg3[0] == '\0') )
{
printf_to_char(ch, "{RAll affects cleared for %s.{x\n\r", victim->name);
sprintf(buf,"$N cleared all affects from $n.");
wiznet(buf, ch, NULL, WIZ_RESTORE, WIZ_SECURE, get_trust(ch));
if ( str_cmp( victim->name, ch->name) )
send_to_char( "{GYou have nothing affecting you now.{x\n\r", victim);
for (paf = victim->affected; paf != NULL; paf = paf_next)
{
paf_next = paf->next;
affect_remove(victim, paf);
}
victim->affected = NULL;
return;
}
/* lookup single spell */
sn = skill_lookup(arg2);
/* strip that spell here */
if (is_affected(victim, sn) )
{
sprintf(buf,"$N cleared %s affect from $n.", skill_table[sn].name);
wiznet(buf, ch, NULL, WIZ_RESTORE, WIZ_SECURE, get_trust(ch));
for (paf = victim->affected; paf != NULL; paf = paf_next)
{
paf_next = paf->next;
if ( paf->type == sn)
affect_remove(victim, paf);
}
printf_to_char(ch, "{RAffect %s removed from %s.{x\n\r", skill_table[sn].name, victim->name);
if ( str_cmp( victim->name, ch->name ) )
printf_to_char(victim,
"You have been striped of %s affect!\n\r", skill_table[sn].name);
return;
}
}/* end of mob/char affects strip */
/*
* strip affect(s) from an oject
*/
if(!str_prefix(arg1, "mob"))
{
/* Object */
OBJ_DATA *obj;
/* no object named */
if ( arg2[0] == '\0' )
{
send_to_char( "{RStrip affects from what object?{x\n\r", ch );
return;
}
/* no object found */
if ( ( obj = get_obj_world( ch, argument ) ) == NULL )
{
send_to_char( "{RNothing like that in hell, earth, or heaven.{x\n\r", ch );
return;
}
/* object level greater than immortal trust level */
if(get_trust( ch ) < obj->level)
{
send_to_char("{RNot on your life!{x\n\r", ch);
return;
}
/* check if clear all */
sprintf(buf,"$N cleared all affects from %s.", arg3);
wiznet(buf, ch, NULL, WIZ_RESTORE, WIZ_SECURE, get_trust(ch));
for (paf = obj->affected; paf != NULL; paf = paf_next)
{
paf_next = paf->next;
affect_remove_obj(obj, paf);
}
obj->affected = NULL;
return;
}/* end of obj affects strip */
send_to_char("{RWhat in blazes name are you doing?{x\n\r", ch);
return;
}/* 010201 */
/*
* (c) 2001 Taka
* add/modify a custom slay message
* 010501
*/
void do_edit_slay(CHAR_DATA *ch, char *argument)
{
char arg1[MIL];
char arg2[MIL];
char arg3[MIL];
char buf[MSL];
char const *sName;
SLAY_MESSAGE *smIndex;
argument = one_argument( argument, arg1);
argument = one_argument( argument, arg2);
/*
* validate command
*/
if ( arg1[0] == '\0' )
{
send_to_char("{RSyntax: {Geditslay <slay message name> <type> <text>{x\n\r", ch);
send_to_char("{M Types = Name, Gerneral, victim, char, room{x\n\r", ch);
send_to_char(" Name = Name of the Slay (place the word new in text for a new slay message)\n\r", ch);
send_to_char(" General = 1=user owned, 0=available all\n\r", ch);
send_to_char(" Victim = Victim display message\n\r", ch);
send_to_char(" Char = Character diplay message\n\r", ch);
send_to_char(" Room = Room display message\n\r", ch);
return;
}
/*
* do not allow a mob to use this command
* not that it will crash the mud but hey for good measure
*/
if ( IS_NPC(ch) )
{
send_to_char("Mobs have no need for slay messages!\n\r", ch);
return;
}
/* set the name */
if(arg2[0] != '\0' && !str_prefix(arg2, "name"))
{
argument = one_argument( argument, arg3);
if(arg3[0] != '\0' && !str_prefix(arg3, "new"))
{
/* Ensure slay message does not already exist */
for(smIndex=SMHead; smIndex != NULL; smIndex=smIndex->SMnext)
{
if(!str_cmp( smIndex->Slay_Name, arg1))
{
printf_to_char(ch, "Slay named %s already exists!\n\r",
smIndex->Slay_Name);
return;
}
}
/*
Slay message does not exist
1) allocate the needed memory for the message
2) set the linked list to blanks except the message name
*/
smIndex = malloc(sizeof(struct slay_message));
smIndex->Slay_Number = 0;
smIndex->Slay_Name = str_dup(arg1);
smIndex->Char_Name = str_dup("");
smIndex->Show_Vict = str_dup("");
smIndex->Show_Char = str_dup("");
smIndex->Show_Room = str_dup("");
AppendSlayMsg( smIndex );
printf_to_char(ch, "New slay named %s has been added.\n\r",
smIndex->Slay_Name);
save_slaym();
return;
}
/* validate message and rename the slay message */
for(smIndex=SMHead; smIndex != NULL; smIndex=smIndex->SMnext)
{
if(!str_cmp( smIndex->Slay_Name, arg1))
{
printf_to_char(ch, "Slay named %s has been renamed to %s.\n\r",
smIndex->Slay_Name, arg1);
smIndex->Slay_Name = str_dup(arg1);
save_slaym();
return;
}
}
/* error has occured on the name prompt */
send_to_char("That is not a slay name!\n\r", ch);
send_to_char("To make a new one use this.\n\r", ch);
printf_to_char(ch, "editslay %s %s new", arg1, arg2);
return;
}
/*
* general flag is used for user specific slays
*/
if(arg2[0] != '\0' && !str_prefix(arg2, "general") && ALLOW_CUSTOM_SLAY)
{
int value;
argument = one_argument( argument, arg3);
if(ch->level < CUSTOM_SLAY_LEVEL)
{
send_to_char("Not at your level!\n\r", ch);
return;
}
if ( arg3[0] == '\0' || !is_number(arg3) )
{
send_to_char("{RYou must enter a number also!{x\n\r", ch);
return;
}
value = atoi(arg3);
/* validate message and set general flag */
for(smIndex=SMHead; smIndex != NULL; smIndex=smIndex->SMnext)
{
if(!str_cmp( smIndex->Slay_Name, arg1))
{
printf_to_char(ch, "Slay named %s set as general %d.\n\r",
smIndex->Slay_Name, value);
if(!value)
smIndex->Char_Name = str_dup("");
else
smIndex->Char_Name = str_dup(ch->name);
save_slaym();
return;
}
}
send_to_char("That is not a slay name!\n\r", ch);
send_to_char("To make a new one use this.\n\r", ch);
printf_to_char(ch, "editslay %s %s new", arg1, arg2);
return;
}
/*
* check and set show messages for slay commands
*/
if((arg2[0] != '\0' && !str_prefix(arg2, "victim"))
|| (arg2[0] != '\0' && !str_prefix(arg2, "char"))
|| (arg2[0] != '\0' && !str_prefix(arg2, "room")))
{
/* check show value */
if ( argument[0] == '\0' )
{
send_to_char("{RYou must enter a text associated to be seen!{x\n\r", ch);
return;
}
/* find the message in question */
for(smIndex=SMHead; smIndex != NULL; smIndex=smIndex->SMnext)
{
if(!str_cmp( smIndex->Slay_Name, arg1))
{
/* victim sees */
if (!str_cmp(arg2, "victim"))
{
printf_to_char(ch, "victim message set to: %s\n\r", argument);
smIndex->Show_Vict = str_dup(argument);
}
/* slayor sees */
else if (!str_cmp(arg2, "char"))
{
printf_to_char(ch, "char message set to: %s\n\r", argument);
smIndex->Show_Char = str_dup(argument);
}
/* room sees */
else if (!str_cmp(arg2, "room"))
{
printf_to_char(ch, "room message set to: %s\n\r", argument);
smIndex->Show_Room = str_dup(argument);
}
else
{
/* error */
send_to_char("Try again!\n\r victim, char or room\n\r", ch);
return;
}
save_slaym();
return;
}
}
/* error slay name not found */
send_to_char("That is not a slay name!\n\r", ch);
send_to_char("To make a new one use this.\n\r", ch);
printf_to_char(ch, "editslay %s %s new", arg1, arg2);
return;
}
/* list all slay names */
if(!str_cmp(arg1, "list"))
{
for(smIndex=SMHead; smIndex != NULL; smIndex=smIndex->SMnext)
{
sName = format_str_len(smIndex->Slay_Name, 14, ALIGN_LEFT);
strcpy (buf, sName);
printf_to_char(ch, "Slay Number: %3d Name: %s Owner: %s\n\r",
smIndex->Slay_Number, buf, smIndex->Char_Name);
printf_to_char(ch, "Vict: %s\n\r", smIndex->Show_Vict);
printf_to_char(ch, "Char: %s\n\r", smIndex->Show_Char);
printf_to_char(ch, "Room: %s\n\r", smIndex->Show_Room);
send_to_char("\n\r", ch);
}
return;
}
/*
* Output a generic error message
*/
send_to_char("An error has occured!\n\r", ch);
return;
}
void do_personal_data(CHAR_DATA *ch, char *argument)
{
char arg1[MIL];
char arg2[MIL];
argument = one_argument( argument, arg1);
/*
* validate command
*/
if ( arg1[0] == '\0' )
{
send_to_char("{RSyntax: {Gpdata <type> <text>{x\n\r", ch);
send_to_char("{M Types = Name, Nickname, Email, Webaddress, Icqno, Note, Show{x\n\r", ch);
send_to_char("{cThese commands are optional.{x\n\r", ch);
return;
}
/*
* do not allow a mob to use this command
* not that it will crash the mud but hey for good measure
*/
if ( IS_NPC(ch) )
{
send_to_char("Mobs have no need for personal info!\n\r", ch);
return;
}
/* set the name */
if(arg1[0] != '\0' && !str_prefix(arg1, "name"))
{
if(argument[0] != '\0')
{
ch->pcdata->personal_name = str_dup(argument);
printf_to_char( ch, "Personal Name set to: %s\n\r", ch->pcdata->personal_name);
return;
}
else
{
send_to_char("{RYou must enter a name!{x\n\r", ch);
return;
}
}
/* set the nickname */
if(arg1[0] != '\0' && !str_prefix(arg1, "nickname"))
{
if(argument[0] != '\0')
{
ch->pcdata->personal_nickname = str_dup(argument);
printf_to_char( ch, "Personal Nickname set to: %s\n\r", ch->pcdata->personal_nickname);
return;
}
else
{
send_to_char("{RYou must enter a nickname!{x\n\r", ch);
return;
}
}
/* set the email */
if(arg1[0] != '\0' && !str_prefix(arg1, "email"))
{
argument = one_argument( argument, arg2);
if(arg2[0] != '\0')
{
ch->pcdata->personal_email = str_dup(arg2);
printf_to_char( ch, "Personal Email set to: %s\n\r", ch->pcdata->personal_email);
return;
}
else
{
send_to_char("{RYou must enter an email!{x\n\r", ch);
return;
}
}
/* set the webaddress */
if(arg1[0] != '\0' && !str_prefix(arg1, "webaddress"))
{
argument = one_argument( argument, arg2);
if(arg2[0] != '\0')
{
ch->pcdata->personal_webaddress = str_dup(arg2);
printf_to_char( ch, "Personal Web Address set to: %s\n\r", ch->pcdata->personal_webaddress);
return;
}
else
{
send_to_char("{RYou must enter a Web Address!{x\n\r", ch);
return;
}
}
/* set the note */
if(arg1[0] != '\0' && !str_prefix(arg1, "note"))
{
if(argument[0] != '\0')
{
ch->pcdata->personal_note = str_dup(argument);
printf_to_char( ch, "Personal Note set to: %s\n\r", ch->pcdata->personal_note);
return;
}
else
{
send_to_char("{RYou must enter a note!{x\n\r", ch);
send_to_char("{GEnter a quote or anything about you that defines you.{x\n\r", ch);
return;
}
}
/* set the icqno */
if(arg1[0] != '\0' && !str_prefix(arg1, "icqno"))
{
argument = one_argument( argument, arg2);
if(arg2[0] != '\0')
{
ch->pcdata->personal_icqno = str_dup(arg2);
printf_to_char( ch, "Personal Icq Number set to: %s\n\r", ch->pcdata->personal_icqno);
return;
}
else
{
send_to_char("{RYou must enter an Icq number!{x\n\r", ch);
return;
}
}
/* set the icqno */
if(arg1[0] != '\0' && !str_prefix(arg1, "show"))
{
printf_to_char( ch, "Personal Name set to: %s\n\r", ch->pcdata->personal_name);
printf_to_char( ch, "Personal Nickname set to: %s\n\r", ch->pcdata->personal_nickname);
printf_to_char( ch, "Personal Email set to: %s\n\r", ch->pcdata->personal_email);
printf_to_char( ch, "Personal Web Address set to: %s\n\r", ch->pcdata->personal_webaddress);
printf_to_char( ch, "Personal Icq Number set to: %s\n\r", ch->pcdata->personal_icqno);
printf_to_char( ch, "Personal Note set to: %s\n\r", ch->pcdata->personal_note);
return;
}
send_to_char("{RIllegal type entered!{x\n\r", ch);
return;
}
void do_personal_who(CHAR_DATA *ch, char *argument)
{
char arg1[MIL];
CHAR_DATA *victim;
argument = one_argument( argument, arg1);
/*
* validate command
*/
if ( arg1[0] == '\0' )
{
send_to_char("{RWho would you like to see personal information for?{x\n\r", ch);
return;
}
/*
* do not allow a mob to use this command
* not that it will crash the mud but hey for good measure
*/
if ( IS_NPC(ch) )
{
send_to_char("{RMobs have no need for personal info!{x\n\r", ch);
return;
}
/* find victim */
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "{Rhat person or mob is not here.{x\n\r",ch);
return;
}
/*
* do not allow a mob to use this command
* not that it will crash the mud but hey for good measure
*/
if ( IS_NPC(victim) )
{
send_to_char("{RMobs have no personal info!{x\n\r", ch);
return;
}
printf_to_char( ch, "{GName: {W%s{x\n\r", victim->name);
printf_to_char( ch, "{GPersonal Name.........: {w%s{x\n\r", victim->pcdata->personal_name);
printf_to_char( ch, "{GPersonal Nickname.....: {w%s{x\n\r", victim->pcdata->personal_nickname);
printf_to_char( ch, "{GPersonal Email........: {w%s{x\n\r", victim->pcdata->personal_email);
printf_to_char( ch, "{GPersonal Web Address..: {w%s{x\n\r", victim->pcdata->personal_webaddress);
printf_to_char( ch, "{GPersonal Icq Number...: {w%s{x\n\r", victim->pcdata->personal_icqno);
printf_to_char( ch, "{GPersonal Note.........: {w%s{x\n\r", victim->pcdata->personal_note);
return;
}
/*
* Adjust Experience command by Taka of Ghost Dancer MUD
*
* This command allows immortals to adjust how much exp a person earns
* it can be used as a punishment of a reward.
*
* 100 is the baseline exp. If an immortal wishes to punish a player with
* 50% normal exp set the value to 50. If an immortal wants to stop all exp
* for a player the set the value to 0. If an immortal wants to reward a
* player set the value above 100 as high as 500 or 5 times normal exp.
*
* Command written 3/16/2001 by Taka 031601
*/
void do_adj_exp(CHAR_DATA *ch, char *argument)
{
char arg1[MIL];
argument = one_argument( argument, arg1);
/* check if the mud allows this command */
if (!ALLOW_EXP)
{
send_to_char("{RYou are not allowed to use this command based on mud preferances!{x\n\r", ch);
return;
}
/*
* validate command
*/
if ( arg1[0] == '\0' )
{
send_to_char("{RSyntax: ADJEXP <name> <amount> <timer>{x\n\r", ch);
send_to_char("{RSyntax: ADJEXP ALL <amount> <timer>{x\n\r", ch);
send_to_char("\n\rAll sets for the entire world where naming a player\n\r", ch);
send_to_char("who is on-line sets it only for that player. The \n\r", ch);
send_to_char("value 100 is for 100% or normal exp.\n\r", ch);
send_to_char("So to punish someone with no exp ADJEXP name 0 <timer>\n\r", ch);
send_to_char("To double someones amount of exp ADJEXP name 200 <timer>\n\r", ch);
send_to_char("The timer is the number of ticks to allow.\n\r", ch);
printf_to_char(ch, "\n\r {cThe current value for global timer is {C%ld {cglobal bonus {C%ld{x\n\r",
EXP_GLOBAL_TIMER, EXP_GLOBAL_AMOUNT);
return;
}
/*
* do not allow a mob to use this command
* not that it will crash the mud but hey for good measure
*/
if ( IS_NPC(ch) )
{
send_to_char("{RMobs have no interest in mortal affairs!{x\n\r", ch);
return;
}
/*
* check name here.
*/
if(!str_cmp(arg1, "all"))
{
char arg2[MIL];
char arg3[MIL];
argument = one_argument( argument, arg2);
argument = one_argument( argument, arg3);
EXP_GLOBAL_AMOUNT = is_number(arg2) ? atoi(arg2) : 100;
EXP_GLOBAL_TIMER = is_number(arg3) ? atoi(arg3) : DEFAULT_EXP_TIMER;
if (EXP_GLOBAL_AMOUNT > MAX_EXP || EXP_GLOBAL_AMOUNT < MIN_EXP)
{
printf_to_char(ch, "{RMinimum allowed is %ld and maximum is %ld{x\n\r",
MIN_EXP, MAX_EXP);
EXP_GLOBAL_AMOUNT = 100;
EXP_GLOBAL_TIMER = -1;
return;
}
if (EXP_GLOBAL_TIMER > MAX_EXP_TIMER || EXP_GLOBAL_TIMER < 1)
{
printf_to_char(ch, "{RMinimum timmer is 1 and maximum is %ld{x\n\r",
MAX_EXP_TIMER);
EXP_GLOBAL_AMOUNT = 100;
EXP_GLOBAL_TIMER = -1;
return;
}
}
else /* all */
{
CHAR_DATA *victim;
char arg2[MIL];
char arg3[MIL];
/* find victim */
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
send_to_char( "{Rhat person is not here.{x\n\r",ch);
return;
}
/*
* do not allow a mob to use this command
* not that it will crash the mud but hey for good measure
*/
if ( IS_NPC(victim) )
{
send_to_char("{RMobs have no need for experience!{x\n\r", ch);
return;
}
argument = one_argument( argument, arg2);
argument = one_argument( argument, arg3);
victim->pcdata->exp_bonus = is_number(arg2) ? atoi(arg2) : 100;
victim->pcdata->exp_timer = is_number(arg3) ? atoi(arg3) : DEFAULT_EXP_TIMER;
if (victim->pcdata->exp_bonus > MAX_EXP || victim->pcdata->exp_bonus < MIN_EXP)
{
printf_to_char(ch, "{RMinimum allowed is %ld and maximum is %ld{x\n\r",
MIN_EXP, MAX_EXP);
victim->pcdata->exp_bonus = 100;
victim->pcdata->exp_timer = -1;
return;
}
if (victim->pcdata->exp_timer > MAX_EXP_TIMER || victim->pcdata->exp_timer < 1)
{
printf_to_char(ch, "{RMinimum timmer is 1 and maximum is %ld{x\n\r",
MAX_EXP_TIMER);
victim->pcdata->exp_bonus = 100;
victim->pcdata->exp_timer = -1;
return;
}
}
return;
}
/*
* Spell Dump lists all the spells by class
*
* Command written 3/29/2001 by Taka 032901
*/
void do_spell_dump(CHAR_DATA *ch, char *argument)
{
char *CName;
char C_Name[MIL];
int iClass, sn;
char arg1[MIL];
FILE *fp;
argument = one_argument( argument, arg1);
if(arg1[0] == '\0')
{
send_to_char("Dump Spells, Skills or Groups!\n\r", ch);
return;
}
if(!str_cmp(arg1, "spells"))
{
/* open file for write */
if ( ( fp = fopen( "spells.dmp", "w" ) ) == NULL )
{
bug( "Spells Dump: fopen", 0 );
send_to_char("{RError dumping spells!{x\n\r", ch);
}
fprintf(fp, "Spell name ");
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
CName = "";
CName = format_str_len(class_table[iClass].name, 15, ALIGN_CENTER);
strcpy(C_Name, CName);
fprintf( fp, "%s ", C_Name );
}
fprintf(fp, "\n");
for (sn = 0; sn < MAX_SKILL; sn++)
{
if (skill_table[sn].name == NULL
|| skill_table[sn].spell_fun == spell_null )
break;
CName = "";
CName = format_str_len(skill_table[sn].name, 25, ALIGN_LEFT);
strcpy(C_Name, CName);
fprintf(fp, "%s ", C_Name);
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
fprintf(fp, " %5d ", skill_table[sn].skill_level[iClass]);
}
fprintf(fp, "\n");
}
fclose( fp );
}
if(!str_cmp(arg1, "skills"))
{
/* open file for write */
if ( ( fp = fopen( "skills.dmp", "w" ) ) == NULL )
{
bug( "Skills Dump: fopen", 0 );
send_to_char("{RError dumping skills!{x\n\r", ch);
}
fprintf(fp, "Skill name ");
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
CName = "";
CName = format_str_len(class_table[iClass].name, 15, ALIGN_CENTER);
strcpy(C_Name, CName);
fprintf( fp, "%s ", C_Name );
}
fprintf(fp, "\n");
for (sn = 0; sn < MAX_SKILL; sn++)
{
if (skill_table[sn].name == NULL )
break;
if( skill_table[sn].spell_fun == spell_null )
{
CName = "";
CName = format_str_len(skill_table[sn].name, 25, ALIGN_LEFT);
strcpy(C_Name, CName);
fprintf(fp, "%s ", C_Name);
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
fprintf(fp, " %5d ", skill_table[sn].skill_level[iClass]);
}
fprintf(fp, "\n");
}
}
fclose( fp );
}
if(!str_cmp(arg1, "groups"))
{
/* open file for write */
if ( ( fp = fopen( "groups.dmp", "w" ) ) == NULL )
{
bug( "Groups Dump: fopen", 0 );
send_to_char("{RError dumping groups!{x\n\r", ch);
}
fprintf(fp, "Groups Spells Spells in group\n");
send_to_char("before loop\n\r", ch);
for (sn = 0; sn < MAX_GROUP; sn++)
{
if (group_table[sn].name == NULL)
break;
CName = "";
CName = format_str_len(group_table[sn].name, 25, ALIGN_LEFT);
strcpy(C_Name, CName);
fprintf( fp, "%s ", C_Name );
for ( iClass = 0; iClass < MAX_IN_GROUP; iClass++ )
{
if(group_table[sn].spells[iClass] != NULL)
{
CName = "";
CName = format_str_len(group_table[sn].spells[iClass], 25, ALIGN_CENTER);
strcpy(C_Name, CName);
fprintf(fp, "%s ", C_Name);
}
}
fprintf(fp, "\n");
}
fprintf(fp, "\n\n\n\n\n\n\n\n");
fprintf(fp, "Group name ");
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
CName = "";
CName = format_str_len(class_table[iClass].name, 15, ALIGN_CENTER);
strcpy(C_Name, CName);
fprintf( fp, "%s ", C_Name );
}
fprintf(fp, "\n");
for (sn = 0; sn < MAX_GROUP; sn++)
{
if (group_table[sn].name == NULL)
break;
CName = "";
CName = format_str_len(group_table[sn].name, 25, ALIGN_LEFT);
strcpy(C_Name, CName);
fprintf( fp, "%s ", C_Name );
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
{
fprintf(fp, " %5d ", group_table[sn].rating[iClass]);
}
fprintf(fp, "\n");
}
fclose( fp );
}
return;
}
/*
* New REBIRTH feature by Taka of GhostMUD project.
* (c) 2001 Taka *041801*
*/
void do_rebirth(CHAR_DATA *ch, char *argument)
{
if(!ch->pcdata->rebirth)
{
ch->pcdata->rebirth = TRUE;
send_to_char("Type rebirth again to confirm this choice!\n\r", ch);
return;
}
/*
* Reset most character information here.
*/
ch->level = 2;
ch->played = 3600;
ch->hit = 40;
ch->max_hit = 40;
ch->mana = 200;
ch->max_mana = 200;
ch->move = 200;
ch->max_move = 200;
ch->exp = exp_per_level(ch,ch->pcdata->points);
ch->train += ch->ri->number_trains;
ch->practice += 9;
ch->pcdata->xweight = 1000;
ch->pcdata->xcarry = 50;
ch->pcdata->last_level = 3600;
ch->pcdata->rebirth = FALSE;
return;
}
bool IS_OUTDOORS( CHAR_DATA *ch ) /* 050201 */
{
if(( IS_SET(ch->in_room->room_flags, ROOM_INDOORS))
|| ( IS_SET(ch->in_room->room_flags, ROOM_DARK))
|| (ch->in_room->sector_type == SECT_INSIDE ))
return FALSE;
else
return TRUE;
}
/*
* TAKA NAME_PET 060801
* Allow the player to name their pets including the description fields
*/
void do_name_pet(CHAR_DATA *ch, char *argument)
{
char buf[MSL], arg1[MSL], arg2[MSL];
smash_tilde(argument);
/* Check if owns a pet */
if ( ch->pet == NULL )
{
printf_to_char(ch, "{RYou should buy a pet first!{x\n\r");
return;
}
/* check if pet and master are in the same room */
if ( ch->in_room != ch->pet->in_room )
{
printf_to_char(ch, "{RYou do not see your pet here.{x\n\r");
return;
}
argument = one_argument(argument, arg1);
/* Check arguments past */
if ( arg1[0] == '\0' || argument[0] == '\0' )
{
printf_to_char(ch, "\n\r{RSyntax: {Wpetname {MType {B<argument>{x\n\r");
printf_to_char(ch, "{M Types = Name, Long, Short, Sex, Info, score, affects{x\n\r");
printf_to_char(ch, "{B Sex = Male, Female, It{x\n\r");
return;
}
if ( !str_prefix(arg1, "name") )
{
argument = one_argument(argument, arg2);
free_string(ch->pet->name);
ch->pet->name = str_dup( capitalize(arg2) );
printf_to_char(ch, "{GYour pets name is: {W%s{x\n\r", ch->pet->name);
}
else if ( !str_prefix(arg1, "long") )
{
free_string(ch->pet->long_descr);
sprintf(buf, "%s\n\r", argument);
ch->pet->long_descr = str_dup(buf);
printf_to_char(ch, "{GYour pet {W%s {Gnow has a long description of: \n\r{B%s{x\n\r",
ch->pet->name, ch->pet->long_descr);
}
else if ( !str_prefix(arg1, "short") )
{
free_string(ch->pet->short_descr);
ch->pet->short_descr = str_dup(argument);
printf_to_char(ch, "{GYour pet {W%s {Gnow has a sshort description of: \n\r{B%s{x\n\r",
ch->pet->name, ch->pet->short_descr);
}
else if ( !str_prefix(arg1, "description") )
{
/*string_append( ch, &ch->pet->description );*/
printf_to_char(ch, "{RUse Order <pet> description -/+ for this{x\n\r");
return;
}
else if ( !str_prefix(arg1, "sex") )
{
argument = one_argument(argument, arg2);
if(!str_prefix(arg2, "male"))
ch->pet->sex = 1;
else if(!str_prefix(arg2, "female"))
ch->pet->sex = 2;
else
ch->pet->sex = 0;
printf_to_char(ch, "{GYour pet is now a: {M%s{x\n\r",
ch->pet->sex == 0 ? "sexless" : ch->pet->sex == 1 ? "male" : "female");
return;
}
else if ( !str_prefix(arg1, "info") )
{
printf_to_char(ch, "{GYour pets name is: {W%s{x\n\r{c%s{x", ch->pet->name, ch->pet->description);
printf_to_char(ch, "{GA long description of: \n\r{B%s{x\n\r",
ch->pet->long_descr);
printf_to_char(ch, "{GA short description of: \n\r{B%s{x\n\r",
ch->pet->short_descr);
printf_to_char(ch, "{GYour pet is a: {M%s{x\n\r",
ch->pet->sex == 0 ? "sexless" : ch->pet->sex == 1 ? "male" : "female");
}
else if ( !str_prefix(arg1, "score") )
{
printf_to_char(ch, "{GYour pets name is: {W%s{x\n\r{", ch->pet->name);
printf_to_char( ch,
"{mStr{x: %d({y%d{x) {mInt{x: %d({y%d{x) {mWis{x: %d({y%d{x) {mDex{x: %d({y%d{x) {mCon{x: %d({y%d{x)\n\r",
ch->pet->perm_stat[STAT_STR],
get_curr_stat(ch->pet,STAT_STR),
ch->pet->perm_stat[STAT_INT],
get_curr_stat(ch->pet,STAT_INT),
ch->pet->perm_stat[STAT_WIS],
get_curr_stat(ch->pet,STAT_WIS),
ch->pet->perm_stat[STAT_DEX],
get_curr_stat(ch->pet,STAT_DEX),
ch->pet->perm_stat[STAT_CON],
get_curr_stat(ch->pet,STAT_CON) );
printf_to_char( ch, "{gHp{x: %d/%d {gMana{x: %d/%d {gMove{x: %d/%d\n\r",
ch->pet->hit, ch->pet->max_hit,
ch->pet->mana, ch->pet->max_mana,
ch->pet->move, ch->pet->max_move);
printf_to_char(ch,"Armor: pierce: %d bash: %d slash: %d magic: %d\n\r",
GET_AC(ch->pet,AC_PIERCE), GET_AC(ch->pet,AC_BASH),
GET_AC(ch->pet,AC_SLASH), GET_AC(ch->pet,AC_EXOTIC));
printf_to_char( ch,
"{RHit{x: %d {RDam{x: %d Saves: %d\n\r",
GET_HITROLL(ch->pet), GET_DAMROLL(ch->pet), ch->pet->saving_throw);
}
else if ( !str_prefix(arg1, "affects") )
{
pet_affects(ch, ch->pet->name);
}
else
do_help(ch, "pets");
return;
}
void pet_affects(CHAR_DATA *ch, char *argument )
{
AFFECT_DATA *paf, *paf_last = NULL;
char *buf4;
char buf3[MSL];
char buf2[MSL];
char buf[MSL];
bool found = FALSE;
long filter;
long printme;
BUFFER *buffer;
OBJ_DATA *obj;
int iWear;
CHAR_DATA *victim;
victim = get_char_world ( ch, argument );
if ( victim == NULL )
{
send_to_char ( "Error has occured.\n\r", ch );
return;
}
buffer = new_buf ( );
if ( victim->affected != NULL )
{
if ( victim == ch )
add_buf ( buffer,
"You are affected by the following spells:\n\r" );
else
{
sprintf ( buf, "%s is affected by the following spells:\n\r",
PERS(victim, ch) );
add_buf ( buffer, buf);
}
for ( paf = victim->affected; paf != NULL; paf = paf->next )
{
if ( paf_last != NULL && paf->type == paf_last->type )
{
if ( get_trust ( victim ) >= 20 )
add_buf ( buffer, " " );
else
continue;
}
else
{
sprintf ( buf, "Spell: %-19s", skill_table[paf->type].name != NULL
? skill_table[paf->type].name : "unknown" );
add_buf ( buffer, buf);
}
if ( get_trust ( victim ) >= 20 )
{
sprintf ( buf, ": modifies %s by %d ",
affect_loc_name( paf->location ),
paf->modifier );
add_buf ( buffer, buf);
if ( paf->duration == -1 )
add_buf ( buffer, "permanently" );
else
{
sprintf ( buf, "for %d hours", paf->duration );
add_buf ( buffer, buf);
}
}
add_buf ( buffer, "\n\r" );
paf_last = paf;
}
found = TRUE;
add_buf ( buffer, "\n\r" );
}
if ( victim->affected_by != 0)
{
bool print = FALSE;
for ( iWear = 0; iWear < MAX_WEAR; iWear++ )
{
if ( ( obj = get_eq_char ( victim, iWear ) ) != NULL )
{
for ( paf = obj->affected; paf != NULL; paf = paf->next )
{
if ( !IS_SET ( victim->affected_by, paf->bitvector ) )
continue;
if ( paf->where != TO_AFFECTS )
continue;
filter = paf->bitvector;
filter &= victim->affected_by;
printme = filter;
if ( !print )
{
if ( victim == ch )
add_buf ( buffer,
"You are affected by the following equipment spells:\n\r" );
else
{
sprintf ( buf,
"%s is affected by the following equipment spells:\n\r",
PERS(victim, ch) );
add_buf ( buffer, buf);
}
print = TRUE;
}
strcpy ( buf3, flag_string ( affect_flags, printme ) );
buf4 = buf3;
buf4 = one_argument ( buf4, buf2 );
while ( buf2[0] )
{
sprintf ( buf, "Spell: %-19s: %s", buf2,
obj->short_descr );
add_buf ( buffer, buf);
add_buf ( buffer, "\n\r" );
buf4 = one_argument ( buf4, buf2 );
}
}
if ( !obj->enchanted )
{
for ( paf = obj->pIndexData->affected; paf != NULL;
paf = paf->next )
{
if ( !IS_SET ( victim->affected_by, paf->bitvector ) )
continue;
if ( paf->where != TO_AFFECTS )
continue;
filter = paf->bitvector;
filter &= victim->affected_by;
printme = filter;
if ( !print )
{
if ( victim == ch )
add_buf ( buffer,
"You are affected by the following equipment spells:\n\r" );
else
{
sprintf ( buf,
"%s is affected by the following equipment spells:\n\r",
PERS(victim, ch) );
add_buf ( buffer, buf);
}
print = TRUE;
}
strcpy ( buf3, flag_string ( affect_flags, printme ) );
buf4 = buf3;
buf4 = one_argument ( buf4, buf2 );
while ( buf2[0] )
{
sprintf ( buf, "Spell: %-19s: %s", buf2,
obj->short_descr );
add_buf ( buffer, buf);
add_buf ( buffer, "\n\r" );
buf4 = one_argument ( buf4, buf2 );
}
}
}
}
}
found = TRUE;
if ( print )
add_buf ( buffer, "\n\r" );
}
if ( !found )
{
if ( victim == ch )
add_buf ( buffer, "You are not affected by any spells.\n\r" );
else
{
sprintf ( buf, "%s is not affected by any spells.\n\r",
PERS(victim, ch) );
add_buf ( buffer, buf);
}
}
page_to_char ( buf_string ( buffer ), ch );
free_buf ( buffer );
return;
}
void strip_mortal_color(char *bufin, bool GLOBAL)
{
const char *pointer;
for(pointer = bufin; *pointer; pointer++)
{
if(*pointer == '{')
{
pointer++;
bufin++;
if(*pointer == 'z')
{
*bufin = ' ';
}
if(*pointer == '`')
{
*bufin = ' ';
}
if(*pointer == '0' && GLOBAL)
{
*bufin = ' ';
}
}
bufin++;
}
}
/*
* TAKA Leave a vehicle 061801
* Allow the player to leave the vehicle they occupy
*/
void do_leave(CHAR_DATA *ch, char *argument)
{
if ( ch->in_room->sector_type == SECT_WATER_NOSWIM)
{
stc("{RAre you sure this is a wise idea? You are still in the water.{x\n\r", ch);
return;
}
if(IS_AFFECTED(ch, AFF_IN_BOAT))
{
REMOVE_BIT(ch->affected_by,AFF_IN_BOAT);
ch->on = NULL;
act( "$n stands and exits from the boat!", ch, 0, 0, TO_ROOM );
stc("{YYou stand and exit from the boat.{x\n\r", ch);
}
else
stc("{RYou are not in a vehicle!{x\n\r", ch);
return;
}
/* taka 10-02-2002*/
/*
* exicute a single command as another player
* immortal command by Taka
* Not for distribution in part or in whole
*/
void do_doas( CHAR_DATA *ch, char *argument )
{
char arg1[MIL];
CHAR_DATA *victim;
DESCRIPTOR_DATA * d_temp;
argument = one_argument( argument, arg1 );
/* mobiles can not do as */
if(IS_NPC(ch))
return;
/* no argument test */
if ( arg1[0] == '\0' )
{
printf_to_char(ch, "{RSyntax: {cdoas (victim) (command)\n\r");
return;
}
/***VALIDATE proper character doing as first***/
/* validate character trying doas is actually playing */
if ( ch->desc == NULL )
return;
/* do not allow switched imms to doas it can cuase a crash */
if ( ch->desc->original != NULL )
{
printf_to_char(ch, "{cYou are switched and can not doas.\n\r" );
return;
}
/***VALIDATE victim***/
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
printf_to_char(ch, "{cThey aren't here.\n\r");
return;
}
/* victim can not be character */
if ( victim == ch )
{
printf_to_char(ch, "{cJust type the command to be yourself.{x\n\r" );
return;
}
/* check trust levels */
if (get_trust(victim) > get_trust(ch))
{
printf_to_char(ch, "{cIn your dreams!{x\n\r");
return;
}
if (!is_room_owner(ch,victim->in_room) && ch->in_room != victim->in_room
&& room_is_private(victim->in_room) && !IS_TRUSTED(ch,IMPLEMENTOR))
{
printf_to_char(ch, "{cThat is a private room.{x\n\r");
return;
}
if ( !str_prefix("delete", argument )
|| !str_prefix( "nuke", argument )
|| !str_prefix( "mob", argument ) )
{
printf_to_char(ch, "{cThat will not be done.{x\n\r" );
return;
}
/**Do command here */
d_temp = victim->desc;
victim->desc = ch->desc;
ch->desc = NULL;
interpret( victim, argument );
ch->desc = victim->desc;
victim->desc = d_temp;
}
/*
* Show command simplifies user interface and just looks better all and all
* By Taka for Bladesingers Song
*
* show list - display the list of show options
* show all - turns on all available show options
* show off - turns off all available show options
* show flip - toggle all options from on to off or off to on
* show (option) - toggles that one option on or off
* show grant - allows immortals to toggle on or off immortal only show options
* like allow reclass or building commands.
* show help - shows some basic help information for this command
* displays options for mortals and immortals and examples
* of syntax
* show version - shows version infor of this command
* show + - list all options currently turned on
* show - - list all options currently turned off
*
* (c) Taka November 2002
* a_ghost_dancer@yahoo.com or a_ghost_dancer@excite.com
*/
void do_show( CHAR_DATA *ch, char * argument )
{
int show;
char buf[MIL], arg1[MIL];
/*
* define tables and arrays as well as global values and file based values
*/
struct show_type show_table [64] =
{
/*
* keyword - show keyword to toggle shows on or off
* on_text - text displayed when option is on or turned on
* off_text - text displayed when option is off or turned off
* field - field to change
* value - value of the flag to be changed
* level - level of show option
* -1 = immortal assigned
* 0 = all can have this show
* ## - level show is available
* cmd group- command group to set on
* Check command group table for list of commands in group
* or type showgroup
*
* NOTE: When you change this table make sure and change the one in show_names
*/
/* mortal messages */
{"hunger", "You will see hunger messages", "You will NOT see hunger messages",
&ch->pcdata->shows, SHOW_HUNGER, 0, 0},
{"thirst", "You will see thirst messages", "You will NOT see thirst messages",
&ch->pcdata->shows, SHOW_THIRST, 0, 0},
{"drunk", "You will see drunk messages", "You will NOT see drunk messages",
&ch->pcdata->shows, SHOW_DRUNK, 0, 0},
{"affects", "You will see affects in score", "You will NOT see affects in score",
&ch->pcdata->shows, SHOW_AFFECTS, 0, 0},
{"immset", "You will see imm set shows", "You will NOT see imm set shows",
&ch->pcdata->shows, SHOW_IMMSET, 0, 0},
/* immortal to set */
{"build1", "You ARE allowed to use build commands level 1", "You are NOT allowed to use build commands level 1",
&ch->pcdata->show2, SHOW_BUILD1, -1, 1},
{"build2", "You ARE allowed to use build commands level 2", "You are NOT allowed to use build commands level 2",
&ch->pcdata->show2, SHOW_BUILD2, -1, 2},
{"build3", "You ARE allowed to use build commands level 3", "You are NOT allowed to use build commands level 3",
&ch->pcdata->show2, SHOW_BUILD3, -1, 3},
/* immortal only */
{"iflags", "You will see item names", "You will NOT see item names",
&ch->pcdata->show2, ISHOW_FLAGS, 52, 0},
{"mflags", "You will see character names", "You will NOT see character names",
&ch->pcdata->show2, MSHOW_FLAGS, 52, 0},
/* end of structure */
{NULL, NULL, NULL,
0, 0, 0, 0}
};
/* end of table */
/* mobs do not need to show anything */
if (IS_NPC( ch ) )
return;
/* check argument for none and display the show list if = none */
if(argument[0] != '\0')
argument = one_argument( argument, arg1 );
else
arg1[0] = '\0';
/*
* show the list of options for the show command to user
* LIST or null shows list and make sure to display the help
* option at bottom of list.
* + show only commands turned on
* - show only commands turned off
*/
if ( !str_prefix( arg1, "list" )
|| arg1[0] == '\0'
|| arg1[0] == '+'
|| arg1[0] == '-')
{
stc("\n\r", ch);
stc(" {CType {wIs Description{w\n\r", ch );
stc(" -------------------------------------------------------{x\n\r",ch);
for ( show = 0; show_table[show].keyword; show++ )
{
if(show_table[show].level <= get_trust (ch))
{
/* check for show only offs */
if ( IS_SET(*show_table[show].set, show_table[show].value )
&& arg1[0] == '-')
continue;
/* check for show only ons */
if ( !IS_SET(*show_table[show].set, show_table[show].value )
&& arg1[0] == '+')
continue;
/*
* color code shopw options.
* {C for normal mortal options
* {M for immortal assigned options
* immortal assigned requires use of show grant function
* {W hero level only options
* {D immortal only options
*/
if(show_table[show].level != -1 && show_table[show].level < LEVEL_HERO)
{
sprintf( buf," {C%c%-9s{w%-8s {w%-30s{x\n\r",
UPPER( *show_table[show].keyword ),
show_table[show].keyword+1,
IS_SET(*show_table[show].set, show_table[show].value ) ?
"{GON{x" : "{ROFF{x",
IS_SET(*show_table[show].set, show_table[show].value ) ?
show_table[show].on_text : show_table[show].off_text );
}/*mortal commands*/
else if(show_table[show].level == LEVEL_HERO)
{
sprintf( buf," {W%c%-9s{w%-8s {w%-30s{x\n\r",
UPPER( *show_table[show].keyword ),
show_table[show].keyword+1,
IS_SET(*show_table[show].set, show_table[show].value ) ?
"{GON{x" : "{ROFF{x",
IS_SET(*show_table[show].set, show_table[show].value ) ?
show_table[show].on_text : show_table[show].off_text );
}/*hero only*/
else if(show_table[show].level > LEVEL_HERO)
{
sprintf( buf," {D%c%-9s{w%-8s {w%-30s{x\n\r",
UPPER( *show_table[show].keyword ),
show_table[show].keyword+1,
IS_SET(*show_table[show].set, show_table[show].value ) ?
"{GON{x" : "{ROFF{x",
IS_SET(*show_table[show].set, show_table[show].value ) ?
show_table[show].on_text : show_table[show].off_text );
}/*immortal only*/
else
{
sprintf( buf," {M%c%-9s{w%-8s {w%-30s{x\n\r",
UPPER( *show_table[show].keyword ),
show_table[show].keyword+1,
IS_SET(*show_table[show].set, show_table[show].value ) ?
"{GON{x" : "{ROFF{x",
IS_SET(*show_table[show].set, show_table[show].value ) ?
show_table[show].on_text : show_table[show].off_text );
}/*immortal assigned*/
stc( buf, ch );
}
}
stc("\n\r{cType Show help for help on this command{x\n\r", ch);
stc("color code legend: {CMortal options {MImm assigned options {WHero only options{x\n\r", ch);
if(IS_IMMORTAL(ch))
stc(" {DImmortal only options{x\n\r", ch);
return;
}
/*
* help option for show command just lists how the command is used and such
* also gives a few examples.
*/
if ( !str_prefix( arg1, "help" ))
{
stc("\n\rSHOW examples:\n\r", ch);
stc("SHOW HUNGER will toggle your hunger message display on and off.\n\r", ch);
stc("SHOW ALL will set all your show options on.\n\r", ch);
stc("SHOW OFF will set all your show options off.\n\r", ch);
stc("SHOW FLIP will set all your show options opposite of current settings.\n\r", ch);
stc("SHOW +/- will show on only for + and off only fo -\n\r", ch);
stc("* Some show commands can not be assigned or toggled by you\n\r", ch);
stc("* these are shown in {Mthis color{x\n\r", ch);
stc("SHOW VERSION will display latest version and updates info\n\r", ch);
stc("SHOW SINGLE will display single line on/off values\n\r", ch);
if(IS_IMMORTAL(ch))
{
stc("{cImmortals can use SHOW GRANT PLAYER FLAG{x\n\r", ch);
stc("{cExample of grant is: {Cshow grant taka build1{x\n\r", ch);
stc("{cThis would grant taka the player the build1 commands\n\r or take them away if she already had them.{x\n\r", ch);
}
stc("\n\rThis command brought to you by Taka (c) 2002\n\r", ch);
stc("\n\rShowgroup will show you the groups you have been assigned by an immortal\n\r", ch);
if(IS_IMMORTAL(ch))
{
stc("{cImmortals for you this command lists all groups and the commands in them.{x\n\r", ch);
}
return;
}
/*
* version info
* version 1.0 displayed just shows and had only a few options
* 1.0a added all/off options
* 1.0b added flip option
* 1.0c added help option
* 1.1 added level to the available settings
* 1.1a added immortal only
* 1.1b added version option
* 1.2 added immortal assigned
* 1.2a added show grant command process
* 1.2b modified grant to str_cmp for exact match
* 1.2c added toggle to show/not show immortal set shows
* 1.3 added command group tables
* 1.3a added showgroups command
* 1.3b added show list+/list- command options
* 1.3c added shortened list+/list- to just +/-
* 1.3d added search in interpet function for commands active
* from command grouped options build command specifically
* 1.4 added show_names function for displaying single line
* 1.4a added show single line function
* 1.4b add shows to stat on PC
*
*/
if ( !str_prefix( arg1, "version" ))
{
stc("\n\rSHOW VERSION:\n\r", ch);
stc("SHOW is copyrighted by Taka and written for bladesigners song.\n\r", ch);
stc("V1.4b is the current version as released by Taka Nov. 2002\n\r", ch);
stc("{c --New versions by: _____ current version number is: #.#x\n\r", ch);
return;
}
/* show compressed version of stats */
if ( !str_prefix( arg1, "single" ))
{
stc("\n\rSHOW compressed to SINGLE line {rOFF {wON{x:\n\r", ch);
sprintf(buf, "%s\n\r", show_names(ch, FALSE));
stc(buf, ch);
return;
}
/* set all shows on that you can set */
if ( !str_prefix( arg1, "all" ) )
{
for( show = 0; show_table[show].keyword; show++ )
{
if(show_table[show].level <= get_trust (ch)
&& show_table[show].level >= 0)
{
SET_BIT(*show_table[show].set, show_table[show].value );
sprintf( buf,"%s\n\r", show_table[show].on_text);
stc(buf,ch);
}
}
return;
}
/* set all show commands off that you can set */
if ( !str_prefix( arg1, "off" ) )
{
for( show = 0; show_table[show].keyword; show++ )
{
if(show_table[show].level <= get_trust (ch)
&& show_table[show].level >= 0)
{
REMOVE_BIT(*show_table[show].set, show_table[show].value );
sprintf( buf,"%s\n\r", show_table[show].off_text);
stc(buf,ch);
}
}
return;
}
/*
* flip flop all show commands that you can set
* any on will be marked off and any off will be marked on
*/
if ( !str_prefix( arg1, "flip" ) )
{
for( show = 0; show_table[show].keyword; show++ )
{
if(show_table[show].level <= get_trust (ch)
&& show_table[show].level >= 0)
{
if ( IS_SET( *show_table[show].set, show_table[show].value ) )
{
REMOVE_BIT(*show_table[show].set, show_table[show].value );
sprintf( buf,"%s\n\r", show_table[show].off_text);
stc(buf,ch);
}
else
{
SET_BIT(*show_table[show].set, show_table[show].value );
sprintf( buf,"%s\n\r", show_table[show].on_text);
stc(buf,ch);
}
}
}
return;
}
/* toggle option now normal character request to toggle */
for ( show = 0; show_table[show].keyword; show++ )
{
/*
* if option is found as prefix against the keyword
* and character trust level is >= minimum show level
* and show level is not -1 (immortal set)
*/
if ( !str_prefix( arg1, show_table[show].keyword )
&& show_table[show].level <= get_trust (ch)
&& show_table[show].level >= 0)
{
/* toggle show option */
if ( !IS_SET( *show_table[show].set, show_table[show].value ) )
{
SET_BIT(*show_table[show].set, show_table[show].value );
stc(show_table[show].on_text, ch );
}
else
{
REMOVE_BIT(*show_table[show].set, show_table[show].value );
stc(show_table[show].off_text, ch );
}
stc("\n\r",ch);
return;
}
}
/*
* immortal only grant use options
* level always == -1
* show grant (name) (option)
*/
if ( !str_prefix( arg1, "grant" ) && IS_IMMORTAL(ch) )
{
char arg2[MIL], arg3[MIL];
CHAR_DATA *victim;
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
/* get victim (name) */
victim = get_char_world ( ch, arg2 );
if ( victim == NULL )
{
stc ( "They're not in the world.\n\r", ch );
return;
}
/* check set option value */
if(arg3[0] == '\0')
{
stc ( "Must supply an option to set.\n\r", ch );
return;
}
/*
* toggle option
* NOTE: I allow immortals to toggle any mortal show value requardless of level
*/
for( show = 0; show_table[show].keyword; show++ )
{
if ( !str_cmp( arg3, show_table[show].keyword ))
{
if ( IS_SET( victim->pcdata->show2, show_table[show].value ) )
{
REMOVE_BIT(victim->pcdata->show2, show_table[show].value );
sprintf( buf,"They can no longer {R%s{x\n\r", show_table[show].keyword);
stc(buf,ch);
sprintf( buf,"%s\n\r", show_table[show].off_text);
stc(buf,victim);
}
else
{
SET_BIT(victim->pcdata->show2, show_table[show].value );
sprintf( buf,"They can now {C%s{x\n\r", show_table[show].keyword);
stc(buf,ch);
sprintf( buf,"%s\n\r", show_table[show].on_text);
stc(buf,victim);
}
}
}
stc("Done.", ch);
return;
}
/* error */
stc("{wThat is not an available option. Try using show help for more details{x\n\r", ch );
return;
}
/*
* show flags in alpha form
*/
char *show_names(CHAR_DATA *ch, bool CALL)
{
static char buf[512], buf1[20];
int show;
bool SHOW = TRUE;
struct shows
{
char * keyword; /* keyword used */
long *set; /* set flags in structure */
long value; /* value to set */
int level; /* level of command */
};
struct shows show_tables [64] =
{
/*
* keyword - show keyword to toggle shows on or off
* field - field to change
* value - value of the flag to be changed
*/
/* mortal messages */
{" hunger", &ch->pcdata->shows, SHOW_HUNGER, 0},
{" thirst", &ch->pcdata->shows, SHOW_THIRST, 0},
{" drunk", &ch->pcdata->shows, SHOW_DRUNK, 0},
{" affects", &ch->pcdata->shows, SHOW_AFFECTS, 0},
{" immset", &ch->pcdata->shows, SHOW_IMMSET, 0},
{" build1", &ch->pcdata->show2, SHOW_BUILD1, 52},
{" build2", &ch->pcdata->show2, SHOW_BUILD2, 52},
{" build3", &ch->pcdata->show2, SHOW_BUILD3, 62},
{" iflags", &ch->pcdata->show2, ISHOW_FLAGS, -1},
{" mflags", &ch->pcdata->show2, MSHOW_FLAGS, -1},
{NULL, 0, 0}
};
/* end of table */
buf[0] = '\0';
strcat(buf, " ");
/*
* do not show imm options to morts
*/
if (!CALL && !IS_IMMORTAL(ch))
SHOW = FALSE;
/*
* display the options in single line text format
*/
for ( show = 0; show_tables[show].keyword; show++ )
{
if ( show_tables[show].level == -1 && !SHOW )
continue;
if ( show_tables[show].level < 52 && show_tables[show].level >= 0)
if ( IS_SET(*show_tables[show].set, show_tables[show].value ))
{
sprintf(buf1, "{w%s", show_tables[show].keyword);
strcat(buf, buf1);
}
else
{
sprintf(buf1, "{r%s", show_tables[show].keyword);
strcat(buf, buf1);
}
else if ( show_tables[show].level > 51 )
if ( IS_SET(*show_tables[show].set, show_tables[show].value ))
{
sprintf(buf1, "{W%s", show_tables[show].keyword);
strcat(buf, buf1);
}
else
{
sprintf(buf1, "{R%s", show_tables[show].keyword);
strcat(buf, buf1);
}
else
if ( IS_SET(*show_tables[show].set, show_tables[show].value ))
{
sprintf(buf1, "{C%s", show_tables[show].keyword);
strcat(buf, buf1);
}
else
{
sprintf(buf1, "{c%s", show_tables[show].keyword);
strcat(buf, buf1);
}
}
return ( buf[0] != '\0' ) ? buf+1 : "none";
}
void do_show_grps( CHAR_DATA *ch, char * argument )
{
char buf[MIL];
int grant, iLoop;
/*
* command groupings
*/
struct cmd_grp table_grp [32] =
{
{"Build1", "Level 1 building commands",
{ "redit", "aedit", "oedit", "hedit", "medit", "edit", "mpedit", "", "", "" },
1, &ch->pcdata->show2, SHOW_BUILD1 },
{"Build2", "Level 2 building commands",
{ "asave", "mpstat", "mpdump", "", "", "", "", "", "", "" },
2, &ch->pcdata->show2, SHOW_BUILD2 },
{"Build3", "Level 3 building commands",
{ "goto", "holylight", "alist", "", "", "", "", "", "", "" },
3, &ch->pcdata->show2, SHOW_BUILD3 },
/* end of structure */
{NULL, NULL,
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
0, NULL, 0}
};
if(IS_NPC(ch))
{
stc("Not in this life time pal!\n\r", ch);
return;
}
/* set all shows on that you can set */
if ( !str_prefix( argument, "all" ) && IS_IMMORTAL(ch) )
{
for ( grant = 0; table_grp[grant].keyword; grant++ )
{
sprintf( buf,"\n\rCommand group {c%s{x\n\r", table_grp[grant].keyword);
stc(buf,ch);
for( iLoop = 0; iLoop < 10; iLoop++)
{
stc(table_grp[grant].commands[iLoop], ch);
stc(" ", ch);
}
stc("\n\r", ch);
}
}
else
{
for ( grant = 0; table_grp[grant].keyword; grant++ )
{
if(IS_SET(*table_grp[grant].set, table_grp[grant].value ))
{
sprintf( buf,"\n\rCommand groups ENABLED {c%s{x\n\r", table_grp[grant].keyword);
stc(buf,ch);
for( iLoop = 0; iLoop < 10; iLoop++)
{
stc(table_grp[grant].commands[iLoop], ch);
stc(" ", ch);
}
stc("\n\r", ch);
}
}
}
return;
}
void do_losereply (CHAR_DATA * ch, char *argument)
{
char arg1[MIL];
CHAR_DATA *victim;
argument = one_argument (argument, arg1);
if (arg1[0] == '\0')
{
stc ("{rWho do you want to lose their reply?{x\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg1)) == NULL)
{
stc ("{rThey aren't here.{x\n\r", ch);
return;
}
/* And here's the real magic.... All of one line! */
victim->reply = NULL;
printf_to_char (ch, "{cReply lost for {w%s.{x\n\r", victim->name);
}