void process_todelete( DESCRIPTOR_DATA *d, CHAR_DATA *ch ) // process the todelete request { if ( ch->pcdata->todelete != 0 ) // if on todelete list { ch->pcdata->todelete = 0; // clear the pcdata->todelete value save_char_obj( ch, FALSE, FALSE ); // save the change remove_todelete( ch->name ); // remove ch from todelete list save_todelete_list( ); // save the change write_to_buffer( d, echo_on_str, 0 ); // prepare message write_to_buffer( d, "\n\r Przerwano kasowanie postaci.\n\r", 0 ); // send message } else // otherwise { char buf[MSL]; // declare char array variable ch->pcdata->todelete = ( TODELETE_DELAY ) + current_time; // set pcdata->todelete save_char_obj( ch, FALSE, FALSE ); // save the change add_todelete( ch->name, ch->pcdata->todelete ); // add ch to todelete list save_todelete_list( ); // save the change write_to_buffer( d, echo_on_str, 0 ); // send empty string sprintf( buf, "\n\r Postaæ zostanie skasowana za %s.\n\r", todelete_time( ch->name, 's' ) ); // prepare message write_to_buffer( d, buf, 0 ); // send message } return; // exit the function }
void do_defect(CHAR_DATA *ch, char *argument) { char arg1[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; argument = one_argument(argument, arg1); if (ch->pcdata->kingdom == 0) { send_to_char("Defect from what? You are not part of a kingdom!",ch); return; } if (str_cmp(arg1,"defect")) { send_to_char("If you want to defect you MUST type it twice.\n\rI.e defect defect\n\r",ch); return; } if ( !str_cmp(kingdom_table[ch->pcdata->kingdom].general,ch->name) || !str_cmp(kingdom_table[ch->pcdata->kingdom].leader,ch->name)) { send_to_char("You may not defect without first renouncing your title.\n\r",ch); return; } send_to_char("You defect from your kingdom...",ch); sprintf(buf,"%s has defected.",ch->name); do_info(ch,buf); ch->pcdata->kingdom = 0; save_char_obj(ch); save_kingdoms(); return; }
void do_approve( CHAR_DATA *ch, char *argument ) { CHAR_DATA *ach; char buf[MAX_STRING_LENGTH]; ach = get_char_world( ch, argument ); if ( ach == NULL || IS_NPC( ach ) ) { send_to_char( "No such character to approve.\n\r", ch ); return; } if ( !IS_SET( ach->act, PLR_REVIEWING ) ) { send_to_char( "That character is not being reviewed.\n\r", ch ); return; } REMOVE_BIT( ach->act, PLR_REJECTED ); REMOVE_BIT( ach->act, PLR_UNAPPROVED ); sprintf( buf, "rm -f %s%s", REJECTED_DIR, capitalize( ach->name ) ); system( buf ); sprintf( buf, "rm -f %s%s", UNAPPROVED_DIR, capitalize( ach->name ) ); system( buf ); save_char_obj( ach ); do_quit( ach, "" ); send_to_char( "Character approved.\n\r", ch ); return; }
void gain_exp (CHAR_DATA * ch, int gain) { char buf[MAX_STRING_LENGTH]; if (IS_NPC (ch) || ch->level >= LEVEL_HERO) return; if(gain > 99) gain = 99; ch->exp += gain; while (ch->level < LEVEL_HERO && ch->exp >= exp_per_level (ch, ch->pcdata->points) * (ch->level + 1)) { send_to_char ("{GYou raise a level!! {x", ch); ch->level += 1; sprintf (buf, "%s gained level %d", ch->name, ch->level); log_string (buf); sprintf (buf, "$N has attained level %d!", ch->level); wiznet (buf, ch, NULL, WIZ_LEVELS, 0, 0); advance_level (ch, FALSE); save_char_obj (ch); } return; }
void shutdown_wgrace( char * info) { char buf[MAX_INPUT_LENGTH]; DESCRIPTOR_DATA *d; for ( d = descriptor_list; d ; d = d->next ) if( d->character && IS_IMMORTAL(d->character) && d->connected == CON_PLAYING ) { sprintf(buf,"\n\r ****************************************************\n\r"); write_to_descriptor (d, buf, 0); sprintf(buf,"Zabugowana komenda: %s, poprzednia: %s\n\r", last_command ? last_command : "nie wiadomo", previous_command ? previous_command: "nie ustawiono" ); write_to_descriptor (d, buf, 0); if( info ) { sprintf(buf," ** Signal: %s \n\r", info); write_to_descriptor (d, buf, 0); } sprintf(buf," ****************************************************\n\r"); write_to_descriptor (d, buf, 0); save_char_obj( d->character, FALSE, FALSE ); } if(!supermob) init_supermob(); free_string(supermob->name); supermob->name=str_dup("*** SYSTEM ***"); do_copyover (supermob,"now"); return; }
void comment_remove( CHAR_DATA * victim, NOTE_DATA * pnote ) { if( !victim->comments ) { bug( "comment remove: null board", 0 ); return; } if( !pnote ) { bug( "comment remove: null pnote", 0 ); return; } /* * Remove comment from linked list. */ if( !pnote->prev ) victim->comments = pnote->next; else pnote->prev->next = pnote->next; STRFREE( pnote->text ); STRFREE( pnote->subject ); STRFREE( pnote->to_list ); STRFREE( pnote->date ); STRFREE( pnote->sender ); DISPOSE( pnote ); /* * Rewrite entire list. */ save_char_obj( victim ); return; }
void do_prename(CHAR_DATA *ch, char *argument) { CHAR_DATA *vict; OBJ_DATA *obj; char arg1[MIL]; argument = one_argument(argument, arg1); if ((vict = get_char_world(ch, arg1)) == NULL || IS_NPC(vict)) { send_to_char("No player by that name.\n\r", ch); return; } if (!*argument) { send_to_char("Rename them to what? syntax: prename originalname newname\n\r", ch); return; } free_string(vict->pcdata->switchname); free_string(vict->name); vict->pcdata->switchname = str_dup(argument); vict->name = str_dup(argument); for (obj = vict->carrying; obj; obj = obj->next_content) { if (!str_cmp(obj->questowner, arg1)) { free_string(obj->questowner); obj->questowner = str_dup(argument); } } sprintf(log_buf, "../player/%s", arg1); unlink(log_buf); sprintf(arg1, "You have been renamed to %s.\n\r", argument); send_to_char(arg1, vict); save_char_obj(vict); return; }
void do_noclan( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH],buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Noclan whom?\n\r", ch ); return; } if ( ( victim = get_char_world( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if ( get_trust( victim ) >= get_trust( ch ) ) { send_to_char( "You failed.\n\r", ch ); return; } if ( IS_SET(victim->act, PLR_NOCLAN) ) { REMOVE_BIT(victim->act, PLR_NOCLAN); send_to_char( "NOCLAN removed.\n\r", ch ); sprintf(buf,"$N allows %s to join pkill clans.",victim->name); wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0); } else { SET_BIT(victim->act, PLR_NOCLAN); if(ch->clan) { victim->clan = 0; victim->rank = 0; } send_to_char( "NOCLAN set.\n\r", ch ); sprintf(buf,"$N forbids %s to join pkill clans.",victim->name); wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0); } save_char_obj( victim ); return; }
void do_save( CHAR_DATA *ch, char *argument ) { if ( IS_NPC(ch) ) return; save_char_obj( ch ); if (!IS_SET(ch->act, PLR_AFK)) send_to_char( "Ok.\n\r", ch ); return; }
/* usun arty ktorym uplynela zywotnosc z postaci o imieniu name */ void remove_artefact_art_destroy( char *name ) { CHAR_DATA * ch; ch = load_char_remote( name ); /* je¿eli 'ch' nie istnieje */ if ( !ch ) { char buf[MSL]; sprintf(buf, "%s: brak pliku postaci %s", __func__, name ); log_string( buf ); return; } save_char_obj( ch, FALSE, TRUE ); free_char( ch ); }
/* basic functions */ void energy_advance(CHAR_DATA *ch) { int needed; if (IS_NPC(ch) || ch->pcdata->in_arena || find_duel(ch)) return; needed = (int)(400 * pow(1.1, ch->pcdata->energy_level)); if (ch->pcdata->energy_used >= needed) { ch->pcdata->energy_used -= needed; ch->pcdata->energy_level++; sendf(ch, "You advanced to energy level %d.\n\r", ch->pcdata->energy_level); save_char_obj(ch); } return; }
void do_renounce(CHAR_DATA *ch, char *argument) { char arg1[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; argument = one_argument(argument, arg1); if (ch->pcdata->kingdom == 0) { send_to_char("Renounce what? You are not part of a kingdom!",ch); return; } if (str_cmp(arg1,"renounce")) { send_to_char("If you want to renounce your title you MUST type it twice.\n\rI.e renounce renounce\n\r",ch); return; } if ( str_cmp(kingdom_table[ch->pcdata->kingdom].general,ch->name) && str_cmp(kingdom_table[ch->pcdata->kingdom].leader,ch->name)) { send_to_char("You may not renounce without first possessing a title.\n\r",ch); return; } if ( !str_cmp(kingdom_table[ch->pcdata->kingdom].general,ch->name) ) { free_string(kingdom_table[ch->pcdata->kingdom].general); kingdom_table[ch->pcdata->kingdom].general = str_dup("No One!"); } else if( !str_cmp(kingdom_table[ch->pcdata->kingdom].leader,ch->name) ) { free_string(kingdom_table[ch->pcdata->kingdom].leader); kingdom_table[ch->pcdata->kingdom].leader = str_dup("No One!"); } send_to_char("You renounce your title...",ch); sprintf(buf,"%s has renounced their title..",ch->name); do_info(ch,buf); save_char_obj(ch); save_kingdoms(); return; }
void do_reject( CHAR_DATA *ch, char *argument ) { CHAR_DATA *ach; char buf[MAX_STRING_LENGTH]; ach = get_char_world( ch, argument ); if ( ach == NULL || IS_NPC( ach ) ) { send_to_char( "No such character to reject.\n\r", ch ); return; } if ( !IS_SET( ach->act, PLR_REVIEWING ) ) { send_to_char( "That character is not being reviewed.\n\r", ch ); return; } SET_BIT( ach->act, PLR_REJECTED ); REMOVE_BIT( ach->act, PLR_UNAPPROVED ); sprintf( buf, "rm -f %s%s", PLAYER_DIR, capitalize( ach->name ) ); system( buf ); sprintf( buf, "rm -f %s%s", UNAPPROVED_DIR, capitalize( ach->name ) ); system( buf ); free_string( ach->pcdata->rejected, MEM_PCDATA ); if ( ch->pnote && ch->pnote->text ) ach->pcdata->rejected = str_dup( ch->pnote->text ); else ach->pcdata->rejected = str_dup( "No specific reject message.\n\r" ); save_char_obj( ach ); do_quit( ach, "" ); send_to_char( "Character rejected.\n\r", ch ); return; }
void do_leaveclan( CHAR_DATA *ch, char *argument ) { CLAN_DATA *clan; char buf [ MAX_STRING_LENGTH ]; if ( !is_clan( ch ) ) { send_to_char( "You aren't a clansman.\n\r", ch ); return; } clan = ch->pcdata->clan; if ( ch->pcdata->rank == RANK_OVERLORD ) { send_to_char( "Huh? An Overlord shouldn't leave his clan!\n\r", ch ); return; } remove_from_clan( ch ); ch->pcdata->rank = RANK_EXILED; sprintf( buf, "You leave %s off into exile.\n\r" "You hear a thundering sound...\n\r\n\r" "A booming voice says: 'You have been exiled. Only the gods can allow you\n\r" "to join another clan, order or guild!'\n\r", clan->name ); send_to_char( buf, ch ); act( "You have left clan $t.", ch, clan->name, NULL, TO_CHAR ); save_char_obj( ch ); return; }
void do_comment( CHAR_DATA * ch, char *argument ) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; char arg1[MAX_INPUT_LENGTH]; NOTE_DATA *pnote; CHAR_DATA *victim; int vnum; int anum; if( IS_NPC( ch ) ) { send_to_char( "Mobs can't use the comment command.\r\n", ch ); return; } if( !ch->desc ) { bug( "do_comment: no descriptor", 0 ); return; } /* * Put in to prevent crashing when someone issues a comment command * from within the editor. -Narn */ if( ch->desc->connected == CON_EDITING || ch->desc->connected == CON_NOTE_TO ) { send_to_char( "You can't use the comment command from within the editor.\r\n", ch ); return; } switch ( ch->substate ) { default: break; case SUB_WRITING_NOTE: if( !ch->pnote ) { bug( "do_comment: note got lost?", 0 ); send_to_char( "Your note got lost!\r\n", ch ); stop_editing( ch ); return; } if( ch->dest_buf != ch->pnote ) bug( "do_comment: sub_writing_note: ch->dest_buf != ch->pnote", 0 ); STRFREE( ch->pnote->text ); ch->pnote->text = copy_buffer( ch ); stop_editing( ch ); return; } set_char_color( AT_NOTE, ch ); argument = one_argument( argument, arg ); smash_tilde( argument ); if( !str_cmp( arg, "about" ) ) { victim = get_char_world( ch, argument ); if( !victim ) { send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */ return; } if( IS_NPC( victim ) ) { send_to_char( "No comments about mobs\r\n", ch ); return; } } if( !str_cmp( arg, "list" ) ) { victim = get_char_world( ch, argument ); if( !victim ) { send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */ return; } if( IS_NPC( victim ) ) { send_to_char( "No comments about mobs\r\n", ch ); return; } if( get_trust( victim ) >= get_trust( ch ) ) { send_to_char( "You're not of the right caliber to do this...\r\n", ch ); return; } if( !victim->comments ) { send_to_char( "There are no relevant comments.\r\n", ch ); return; } vnum = 0; for( pnote = victim->comments; pnote; pnote = pnote->next ) { vnum++; sprintf( buf, "%2d) %-10s [%s] %s\r\n", vnum, pnote->sender, pnote->date, pnote->subject ); /* Brittany added date to comment list and whois with above change */ send_to_char( buf, ch ); } /* * act( AT_ACTION, "$n glances over the notes.", ch, NULL, NULL, TO_ROOM ); */ return; } if( !str_cmp( arg, "read" ) ) { bool fAll; argument = one_argument( argument, arg1 ); victim = get_char_world( ch, arg1 ); if( !victim ) { send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */ return; } if( IS_NPC( victim ) ) { send_to_char( "No comments about mobs\r\n", ch ); return; } if( get_trust( victim ) >= get_trust( ch ) ) { send_to_char( "You're not of the right caliber to do this...\r\n", ch ); return; } if( !victim->comments ) { send_to_char( "There are no relevant comments.\r\n", ch ); return; } if( !str_cmp( argument, "all" ) ) { fAll = TRUE; anum = 0; } else if( is_number( argument ) ) { fAll = FALSE; anum = atoi( argument ); } else { send_to_char( "Note read which number?\r\n", ch ); return; } vnum = 0; for( pnote = victim->comments; pnote; pnote = pnote->next ) { vnum++; if( vnum == anum || fAll ) { sprintf( buf, "[%3d] %s: %s\r\n%s\r\nTo: %s\r\n", vnum, pnote->sender, pnote->subject, pnote->date, pnote->to_list ); send_to_char( buf, ch ); send_to_char( pnote->text, ch ); /* * act( AT_ACTION, "$n reads a note.", ch, NULL, NULL, TO_ROOM ); */ return; } } send_to_char( "No such comment.\r\n", ch ); return; } if( !str_cmp( arg, "write" ) ) { note_attach( ch ); ch->substate = SUB_WRITING_NOTE; ch->dest_buf = ch->pnote; start_editing( ch, ch->pnote->text ); return; } if( !str_cmp( arg, "subject" ) ) { note_attach( ch ); STRFREE( ch->pnote->subject ); ch->pnote->subject = STRALLOC( argument ); send_to_char( "Ok.\r\n", ch ); return; } if( !str_cmp( arg, "to" ) ) { note_attach( ch ); STRFREE( ch->pnote->to_list ); ch->pnote->to_list = STRALLOC( argument ); send_to_char( "Ok.\r\n", ch ); return; } if( !str_cmp( arg, "clear" ) ) { if( ch->pnote ) { STRFREE( ch->pnote->text ); STRFREE( ch->pnote->subject ); STRFREE( ch->pnote->to_list ); STRFREE( ch->pnote->date ); STRFREE( ch->pnote->sender ); DISPOSE( ch->pnote ); } ch->pnote = NULL; send_to_char( "Ok.\r\n", ch ); return; } if( !str_cmp( arg, "show" ) ) { if( !ch->pnote ) { send_to_char( "You have no comment in progress.\r\n", ch ); return; } sprintf( buf, "%s: %s\r\nTo: %s\r\n", ch->pnote->sender, ch->pnote->subject, ch->pnote->to_list ); send_to_char( buf, ch ); send_to_char( ch->pnote->text, ch ); return; } if( !str_cmp( arg, "post" ) ) { char *strtime; if( !ch->pnote ) { send_to_char( "You have no comment in progress.\r\n", ch ); return; } argument = one_argument( argument, arg1 ); victim = get_char_world( ch, arg1 ); if( !victim ) { send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */ return; } if( IS_NPC( victim ) ) { send_to_char( "No comments about mobs\r\n", ch ); return; } if( get_trust( victim ) > get_trust( ch ) ) { send_to_char( "You're not of the right caliber to do this...\r\n", ch ); return; } /* * act( AT_ACTION, "$n posts a note.", ch, NULL, NULL, TO_ROOM ); */ strtime = ctime( ¤t_time ); strtime[strlen( strtime ) - 1] = '\0'; ch->pnote->date = STRALLOC( strtime ); pnote = ch->pnote; ch->pnote = NULL; /* * LIFO to make life easier */ pnote->next = victim->comments; if( victim->comments ) victim->comments->prev = pnote; pnote->prev = NULL; victim->comments = pnote; save_char_obj( victim ); #ifdef NOTDEFD fclose( fpReserve ); sprintf( notefile, "%s/%s", BOARD_DIR, board->note_file ); if( ( fp = fopen( notefile, "a" ) ) == NULL ) { perror( notefile ); } else { fprintf( fp, "Sender %s~\nDate %s~\nTo %s~\nSubject %s~\nText\n%s~\n\n", pnote->sender, pnote->date, pnote->to_list, pnote->subject, pnote->text ); fclose( fp ); } fpReserve = fopen( NULL_FILE, "r" ); #endif send_to_char( "Ok.\r\n", ch ); return; } if( !str_cmp( arg, "remove" ) ) { argument = one_argument( argument, arg1 ); victim = get_char_world( ch, arg1 ); if( !victim ) { send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */ return; } if( IS_NPC( victim ) ) { send_to_char( "No comments about mobs\r\n", ch ); return; } if( ( get_trust( victim ) >= get_trust( ch ) ) || ( get_trust( ch ) < 58 ) ) /* switch to some LEVEL_ thingie */ { send_to_char( "You're not of the right caliber to do this...\r\n", ch ); return; } /* * argument = one_argument(argument, arg); */ if( !is_number( argument ) ) { send_to_char( "Comment remove which number?\r\n", ch ); return; } anum = atoi( argument ); vnum = 0; for( pnote = victim->comments; pnote; pnote = pnote->next ) { vnum++; if( ( 58 <= get_trust( ch ) ) /* switch to some LEVEL_ thingie */ && ( vnum == anum ) ) { comment_remove( victim, pnote ); send_to_char( "Ok.\r\n", ch ); /* * act( AT_ACTION, "$n removes a note.", ch, NULL, NULL, TO_ROOM ); */ return; } } send_to_char( "No such comment.\r\n", ch ); return; } send_to_char( "Type 'help comment' for usage (i hope!).\r\n", ch ); return; }
void do_samlearn( CHAR_DATA *ch, char *argument ) { char arg1 [MAX_INPUT_LENGTH]; int aura = 0; int cost = 0; smash_tilde(argument); argument = one_argument(argument,arg1); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_SAMURAI)) { send_to_char( "Huh?\n\r", ch); return; } if ( arg1[0] == '\0' ) { send_to_char( "Syntax: Samlearn <power>\n\r", ch ); send_to_char("#r ___________________________________________\n\r",ch); send_to_char("#r/ #cName#r | #cCost#r | #cName#r | #cCost#r \\\n\r",ch); send_to_char("#r|------------+--------+------------+--------| \n\r",ch); send_to_char("#r| #gLitSword #r| #y250 #r| #gSword #r| #y200#r | \n\r",ch); send_to_char("#r| #gIceSword #r| #y350 #r| #gFireSword #r| #y300#r | \n\r",ch); send_to_char("#r| #gSoulSword #r| #y500 #r| #gDrainSword #r| #y400#r | \n\r",ch); send_to_char("#r\\___________________________________________/\n\r",ch); return; } if (!str_cmp(arg1,"soulsword")) { aura = SAM_SOULSWORD; cost = 500; } else if (!str_cmp(arg1,"drainsword")) { aura = SAM_DRAINSWORD; cost = 400; } else if (!str_cmp(arg1,"icesword")) { aura = SAM_ICESWORD; cost = 350; } else if (!str_cmp(arg1,"firesword")) { aura = SAM_FIRESWORD; cost = 300; } else if (!str_cmp(arg1,"litsword")) { aura = SAM_LITSWORD; cost = 250; } else if (!str_cmp(arg1,"sword")) { aura = SAM_SWORD; cost = 200; } else { send_to_char( "Syntax: Samlearn <power>\n\r", ch ); send_to_char("#r ___________________________________________\n\r",ch); send_to_char("#r/ #cName#r | #cCost#r | #cName#r | #cCost#r \\\n\r",ch); send_to_char("#r|------------+--------+------------+--------| \n\r",ch); send_to_char("#r| #gLitSword #r| #y250 #r| #gSword #r| #y200#r | \n\r",ch); send_to_char("#r| #gIceSword #r| #y350 #r| #gFireSword #r| #y300#r | \n\r",ch); send_to_char("#r| #gSoulSword #r| #y500 #r| #gDrainSword #r| #y400#r | \n\r",ch); send_to_char("#r\\___________________________________________/\n\r",ch); return; } if ((aura == SAM_LITSWORD) && (!IS_SAMPOWER(ch, SAM_SWORD))) { send_to_char("Without learning Sword this is useless.\n\r",ch); return; } if ((aura == SAM_FIRESWORD) && (!IS_SAMPOWER(ch, SAM_LITSWORD))) { send_to_char("You may not learn FireSword until you learn LitSword.\n\r",ch); return; } if ((aura == SAM_ICESWORD) && (!IS_SAMPOWER(ch, SAM_FIRESWORD))) { send_to_char("You may not learn IceSword until you learn FirSword.\n\r",ch); return; } if ((aura == SAM_DRAINSWORD) && (!IS_SAMPOWER(ch, SAM_ICESWORD))) { send_to_char("You may not learn DrainSword until you learn IceSword.\n\r",ch); return; } if ((aura == SAM_SOULSWORD) && (!IS_SAMPOWER(ch, SAM_DRAINSWORD))) { send_to_char("You may not learn SoulSword until you've mastered all sword techniques.\n\r",ch); return; } if (IS_SAMPOWER(ch, aura)) { send_to_char("You already have that power.\n\r",ch); return; } if (ch->practice < cost) { send_to_char("You have insufficient primal to learn that power.\n\r",ch); return; } SET_BIT(ch->pcdata->powers[SAMURAI_MARTIAL], aura); ch->practice -= cost; send_to_char( "Ok.\n\r", ch); save_char_obj(ch); return; }
void do_save( CHAR_DATA * ch, char * argument ) { save_char_obj( ch ); save_finger( ch ); send_to_char( AT_WHITE, "The gods smile upon you and save your soul.\n\r", ch ); return; }
void do_quit( CHAR_DATA * ch, char * argument ) { DESCRIPTOR_DATA * d; CHAR_DATA * PeT; CHAR_DATA * gch; if ( ch->position == POS_FIGHTING ) { send_to_char( AT_WHITE, "No way! You are fighting.\n\r", ch ); return; } if ( ch->position < POS_STUNNED ) { send_to_char( AT_WHITE, "You're not DEAD yet.\n\r", ch ); return; } if ( ch->combat_timer ) { send_to_char( AT_WHITE, "Your adrenaline is pumping too hard.\n\r", ch ); return; } if ( ch->in_room->vnum == ROOM_VNUM_SMITHY ) { send_to_char( AT_WHITE, "You cannot quit in this room.\n\r", ch ); return; } if ( ch->questobj ) { if ( ch->questobj->carried_by == ch ) { extract_obj( ch->questobj ); } else { ch->questobj->timer = 1; } } send_to_char( AT_BLUE, "[ The clear sky of reality slowly crosses the horizon.\n\r", ch ); send_to_char( AT_BLUE, " With much effort you tear yourself free of the storm, but\n\r ", ch ); send_to_char( AT_BLUE, "deep within your heart you know that there is no escaping\n\r ", ch ); send_to_char( AT_BLUE, " the storm that rages within... ]\n\r\n\r", ch ); send_to_char( C_DEFAULT, "", ch ); if ( !CHECK_BIT( ch->act, PLR_WIZINVIS ) && !IS_AFFECTED2( ch, AFF_PLOADED ) ) { act( AT_BLOOD, "$n has left the game.", ch, NULL, NULL, TO_ROOM ); if ( !CHECK_BIT( ch->act, PLR_CLOAKED ) ) { info( "%s has left the storm.", (int)( ch->name ), 0 ); } } else { for ( gch = ch->in_room->people; gch; gch = gch->next_in_room ) { if ( ch != gch && get_trust( gch ) >= ch->wizinvis ) { act( AT_BLOOD, "$N slightly phased has left the storm.", gch, NULL, ch, TO_CHAR ); } } } if ( IS_AFFECTED2( ch, AFF_PLOADED ) ) { REMOVE_BIT( ch->affected_by2, AFF_PLOADED ); } if ( ch->level != L_IMP ) { sprintf( log_buf, "$N has quit in room vnum %d.", ch->in_room->vnum ); wiznet( log_buf, ch, NULL, WIZ_LOGINS, 0, get_trust( ch ) ); } if ( CHECK_BIT( ch->act, PLR_QUEST ) ) { REMOVE_BIT( ch->act, PLR_QUEST ); } if ( CHECK_BIT( ch->act, PLR_QUESTOR ) ) { REMOVE_BIT( ch->act, PLR_QUESTOR ); } save_char_obj( ch ); save_finger( ch ); for ( PeT = ch->in_room->people; PeT; PeT = PeT->next_in_room ) { if ( IS_NPC( PeT ) ) { if ( CHECK_BIT( PeT->act, ACT_PET ) && ( PeT->master == ch ) ) { extract_char( PeT, TRUE ); break; } } } d = ch->desc; extract_char( ch, TRUE ); if ( d ) { close_socket( d ); } return; }
/* * Update all chars, including mobs. */ void char_update (void) { CHAR_DATA *ch = NULL; CHAR_DATA *ch_next; CHAR_DATA *ch_quit; ch_quit = NULL; /* update save counter */ save_number++; if (save_number > 29) save_number = 0; for (ch = char_list; ch != NULL; ch = ch_next) { AFFECT_DATA *paf; AFFECT_DATA *paf_next; ch_next = ch->next; if(!ch->infight) { ch->hit = ch->max_hit; ch->mana = ch->max_mana; ch->move = ch->max_move; update_pos (ch); } if (ch->timer > 30) ch_quit = ch; if (ch->position == POS_STUNNED) update_pos (ch); if (!IS_NPC (ch) && ch->level < LEVEL_IMMORTAL) { if (IS_IMMORTAL (ch)) ch->timer = 0; if (++ch->timer >= 12) { if (ch->was_in_room == NULL && ch->in_room != NULL) { ch->was_in_room = ch->in_room; act ("$n disappears into the void.", ch, NULL, NULL, TO_ROOM); send_to_char ("You disappear into the void.\n\r", ch); if (ch->level > 1) save_char_obj (ch); char_from_room (ch); char_to_room (ch, get_room_index (2)); } } gain_condition (ch, COND_DRUNK, -1); gain_condition (ch, COND_FULL, ch->size > SIZE_MEDIUM ? -4 : -2); gain_condition (ch, COND_THIRST, -1); gain_condition (ch, COND_HUNGER, ch->size > SIZE_MEDIUM ? -2 : -1); } for (paf = ch->affected; paf != NULL; paf = paf_next) { paf_next = paf->next; if (paf->duration > 0) { paf->duration--; if (number_range (0, 4) == 0 && paf->level > 0) paf->level--; /* spell strength fades with time */ } else if (paf->duration < 0); else { if (paf_next == NULL || paf_next->type != paf->type || paf_next->duration > 0) { if (paf->type > 0 && skill_table[paf->type].msg_off) { send_to_char (skill_table[paf->type].msg_off, ch); send_to_char ("\n\r", ch); } } affect_remove (ch, paf); } } /* * Careful with the damages here, * MUST NOT refer to ch after damage taken, * as it may be lethal damage (on NPC). */ if (ch->position == POS_INCAP && number_range (0, 1) == 0) { damage (ch, ch, 1, TYPE_UNDEFINED, ELE_NON, FALSE); } else if (ch->position == POS_MORTAL) { damage (ch, ch, 1, TYPE_UNDEFINED, ELE_NON, FALSE); } } /* * Autosave and autoquit. * Check that these chars still exist. */ for (ch = char_list; ch != NULL; ch = ch_next) { /* * Edwin's fix for possible pet-induced problem * JR -- 10/15/00 */ if (!IS_VALID(ch)) { bug("update_char: Trying to work with an invalidated character.\n",0); break; } ch_next = ch->next; if (ch->desc != NULL && ch->desc->descriptor % 30 == save_number) { save_char_obj (ch); } if (ch == ch_quit) { do_function (ch, &do_quit, ""); } } return; }
void raw_kill( CHAR_DATA *victim, int absolute ) { int i = 0; /* if(victim->fighting != NULL) { if(victim->fighting->ooc_xp_count < 2) { send_to_char("You learn from your encounter.\n\r", victim->fighting); victim->fighting->exp += 1; } stop_fighting( victim, TRUE ); } */ if(!absolute && victim->race == race_lookup("werewolf") && ((i = dice_rolls(victim, victim->max_RBPG, 8)) > 0 || victim->agghealth > 0)) { bool tag = FALSE; if(victim->health < 0) victim->health = 0; if(victim->agghealth < 0) { victim->agghealth = 0; tag = TRUE; } if(absolute) tag = TRUE; if(tag) { i -= 7 - victim->health; if(i > 0) victim->agghealth += UMIN(7 - victim->agghealth, i); } else while((victim->agghealth + victim->health - 7) <= 0) { if(victim->health >= 7) victim->agghealth++; else victim->health++; } send_to_char("It hurts, but your body starts to heal.\n\r", victim); update_pos(victim, 0); if((victim->agghealth + victim->health - 7) > 0) return; } if(victim->clan == clan_lookup("bone gnawer") && victim->disc[DISC_TRIBE] >= 5 && victim->max_willpower > 0) { victim->max_willpower--; if(victim->willpower > victim->max_willpower) { victim->willpower = victim->max_willpower; } if(victim->health <= 0) victim->health = 1; if(victim->agghealth <= 0) victim->agghealth = 1; while((victim->agghealth + victim->health - 7) <= 0) { if(victim->health >= 7) victim->agghealth++; else victim->health++; } send_to_char("It hurts, but you'll live.\n\r", victim); return; } death_cry( victim ); make_corpse( victim ); if ( IS_NPC(victim) ) { victim->pIndexData->killed++; extract_char( victim, TRUE ); return; } clear_orgs(victim); if(victim->desc) victim->desc->connected = CON_DECEASED; SET_BIT(victim->act, ACT_REINCARNATE); char_from_room(victim); char_from_list(victim); send_to_char("You are DEAD!\n\r[Hit Return to Continue]\n\r", victim); victim->exp = get_points(victim); save_char_obj(victim); return; }
void do_withdraw( CHAR_DATA *ch, char *argument ) { BANK_DATA *bank; CHAR_DATA *banker; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int type = DEFAULT_CURR; int amount = 0; /* * arg1 == amount * arg2 == currency */ if ( !( banker = find_banker( ch ) ) ) { send_to_char( "You're not in a bank!\r\n", ch ); return; } if ( IS_NPC( ch ) ) { snprintf( buf, MSL, "say Sorry, %s, we don't do business with mobs.", ch->name ); interpret( banker, buf ); return; } if ( argument[0] == '\0' ) { send_to_char( "Syntax: withdraw [amount] [currency]\n", ch ); interpret( banker, ( char * ) "say if you need help type &WHELP BANK&D." ); return; } if ( ch->pcdata->bank == NULL ) { send_to_char( "You don't have any bank account open now.\r\n", ch ); return; } /* * Just to make sure that we are retrieving the latest bank info, not relying on the * stale bank info in pcdata struct */ bank = find_bank( ch->pcdata->bank->name ); if ( !bank ) { send_to_char( "There is no account by that name!\r\n", ch ); return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( !str_cmp( arg1, "all" ) ) { amount = -1; } else if ( !is_number( arg1 ) ) { send_to_char( "You can only withdraw coins.\r\n", ch ); return; } else { amount = atoi( arg1 ); } if ( arg1 && arg2 ) type = get_currency_type( arg2 ); if ( type == CURR_NONE ) { send_to_char( "You don't have any of that kind of coin.\r\n", ch ); return; } if ( amount <= 0 ) { send_to_char( "You can't do that.\r\n", ch ); return; } if ( money_weight( amount, type ) + ch->carry_weight >= can_carry_w( ch ) ) { send_to_char( "You can't carry that much.\r\n", ch ); return; } if ( type == CURR_BRONZE ) { if ( amount > bank->bronze ) { ch_printf( ch, "You don't have that much %s in the bank.\r\n", curr_types[type] ); return; } bank->bronze -= amount; ch_printf( ch, "This brings your account bronze balance to %d.\r\n", bank->bronze ); } else if ( type == CURR_COPPER ) { if ( amount > bank->copper ) { ch_printf( ch, "You don't have that much %s in the bank.\r\n", curr_types[type] ); return; } bank->copper -= amount; ch_printf( ch, "This brings your account copper balance to %d.\r\n", bank->copper ); } else if ( type == CURR_GOLD ) { if ( amount > bank->gold ) { ch_printf( ch, "You don't have that much %s in the bank.\r\n", curr_types[type] ); return; } bank->gold -= amount; ch_printf( ch, "This brings your account gold balance to %d.\r\n", bank->gold ); } else if ( type == CURR_SILVER ) { if ( amount > bank->silver ) { ch_printf( ch, "You don't have that much %s in the bank.\r\n", curr_types[type] ); return; } bank->silver -= amount; ch_printf( ch, "This brings your account silver balance to %d.\r\n", bank->silver ); } else { send_to_char( "No such currency.\r\n", ch ); return; } GET_MONEY( ch, type ) += amount; ch_printf( ch, "You took %d %s coins from the bank.\r\n", amount, curr_types[type] ); bank->lastused = current_time; save_bank( ); save_char_obj( ch ); return; }
void do_deposit( CHAR_DATA *ch, char *argument ) { BANK_DATA *bank; CHAR_DATA *banker; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int type = DEFAULT_CURR; int amount = 0, x; bool dall = FALSE, ssave = FALSE; /* * arg1 == amount * arg2 == currency */ if ( !( banker = find_banker( ch ) ) ) { send_to_char( "You're not in a bank!\r\n", ch ); return; } if ( IS_NPC( ch ) ) { snprintf( buf, MSL, "say Sorry, %s, we don't do business with mobs.", ch->name ); interpret( banker, buf ); return; } if ( !argument || argument[0] == '\0' ) { send_to_char( "Syntax: deposit [amount] [currency]\n", ch ); interpret( banker, ( char * ) "say if you need help type &WHELP BANK&D." ); return; } if ( !ch->pcdata->bank ) { send_to_char( "You don't have any bank account open now.\r\n", ch ); return; } /* * Just to make sure that we are retrieving the latest bank info, not relying on the * stale bank info in pcdata struct */ bank = find_bank( ch->pcdata->bank->name ); if ( !bank ) { send_to_char( "There is no account by that name!\r\n", ch ); return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1 && !str_cmp( arg1, "all" ) ) dall = TRUE; if ( dall && ( !arg2 || arg2[0] == '\0' ) ) { for ( x = 0; x < MAX_CURR_TYPE; x++ ) { if ( GET_MONEY( ch, x ) > 0 ) { ssave = TRUE; amount = GET_MONEY( ch, x ); GET_MONEY( ch, x ) -= amount; ch_printf( ch, "You put %d %s coins in the bank.\r\n", amount, curr_types[x] ); if ( x == CURR_BRONZE ) { bank->bronze += amount; ch_printf( ch, "This brings your account's bronze balance to %d.\r\n", bank->bronze ); } else if ( x == CURR_COPPER ) { bank->copper += amount; ch_printf( ch, "This brings your account's copper balance to %d.\r\n", bank->copper ); } else if ( x == CURR_GOLD ) { bank->gold += amount; ch_printf( ch, "This brings your account's gold balance to %d.\r\n", bank->gold ); } else if ( x == CURR_SILVER ) { bank->silver += amount; ch_printf( ch, "This brings your account's silver balance to %d.\r\n", bank->silver ); } } } if ( ssave ) { save_char_obj( ch ); bank->lastused = current_time; save_bank( ); } return; } if ( !dall && !is_number( arg1 ) ) { send_to_char( "How much do you wish to deposit.\r\n", ch ); return; } if ( !dall ) amount = atoi( arg1 ); if ( arg2 ) type = get_currency_type( arg2 ); if ( dall ) amount = GET_MONEY( ch, type ); if ( amount <= 0 ) { send_to_char( "You can't do that.\r\n", ch ); return; } if ( amount > GET_MONEY( ch, type ) ) { send_to_char( "You don't have that much.\r\n", ch ); return; } if ( type != CURR_BRONZE && type != CURR_COPPER && type != CURR_GOLD && type != CURR_SILVER ) { send_to_char( "No such currency.\r\n", ch ); return; } GET_MONEY( ch, type ) -= amount; ch_printf( ch, "You put %d %s coins in the bank.\r\n", amount, curr_types[type] ); if ( type == CURR_BRONZE ) { bank->bronze += amount; ch_printf( ch, "This brings your account's bronze balance to %d.\r\n", bank->bronze ); } else if ( type == CURR_COPPER ) { bank->copper += amount; ch_printf( ch, "This brings your account's copper balance to %d.\r\n", bank->copper ); } else if ( type == CURR_GOLD ) { bank->gold += amount; ch_printf( ch, "This brings your account's gold balance to %d.\r\n", bank->gold ); } else if ( type == CURR_SILVER ) { bank->silver += amount; ch_printf( ch, "This brings your account's silver balance to %d.\r\n", bank->silver ); } save_char_obj( ch ); bank->lastused = current_time; save_bank( ); }
void do_account( CHAR_DATA *ch, char *argument ) { BANK_DATA *bank; CHAR_DATA *banker; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; char buf[MSL], *pwdnew, *p; int currtime = time( 0 ); /* * arg1 == account name * arg2 == password (if none, close it) */ if ( !( banker = find_banker( ch ) ) ) { send_to_char( "You're not in a bank!\r\n", ch ); return; } if ( IS_NPC( ch ) || IS_IMMORTAL( ch ) ) { snprintf( buf, MSL, "say Sorry, %s, we don't do business with mobs, or 6D STAFF.", ch->name ); interpret( banker, buf ); return; } if ( argument[0] == '\0' ) { send_to_char( "Syntax: account [account name] [account password]\n", ch ); send_to_char( "Syntax: account [account name] [account password] [create/delete]\n", ch ); send_to_char( "Syntax: account [account name]\n", ch ); interpret( banker, ( char * ) "say if you need help type &WHELP BANK&D." ); return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); bank = find_bank( arg1 ); if ( !str_cmp( arg3, "create" ) ) { if ( strlen( arg1 ) < 4 ) { send_to_char( "Account name must be at least 4 characters.\r\n", ch ); return; } if ( strlen( arg2 ) < 5 ) { send_to_char( "Invalid Password. Must be at least 5 characters in length.\r\n", ch ); return; } if ( arg2[0] == '!' ) { send_to_char( "Password cannot begin with the '!' character.\r\n", ch ); return; } if ( bank ) { send_to_char( "There is already an account with that name!\r\n", ch ); return; } if ( ( currtime - ch->pcdata->lastaccountcreated ) < 3600 ) { send_to_char ( "Please wait at least one hour from previous creation time to make a new account.\r\n", ch ); return; } pwdnew = crypt( arg2, arg1 ); for ( p = pwdnew; *p != '\0'; p++ ) { if ( *p == '~' ) { send_to_char( "Password not acceptable, try again.\r\n", ch ); return; } } CREATE( bank, BANK_DATA, 1 ); bank->lastused = current_time; bank->name = STRALLOC( arg1 ); bank->password = STRALLOC( pwdnew ); bank->bronze = 0; bank->copper = 0; bank->gold = 0; bank->silver = 0; add_bank( bank ); save_bank( ); ch->pcdata->lastaccountcreated = currtime; save_char_obj( ch ); saving_char = NULL; send_to_char( "Your account has been added.\r\n", ch ); return; } else if ( !str_cmp( arg3, "delete" ) ) { if ( !bank ) { send_to_char( "There is no account with that name!\r\n", ch ); return; } if ( strcmp( crypt( arg2, bank->password ), bank->password ) ) { send_to_char( "Invalid password.\r\n", ch ); return; } GET_MONEY( ch, CURR_GOLD ) += bank->gold; GET_MONEY( ch, CURR_SILVER ) += bank->silver; GET_MONEY( ch, CURR_BRONZE ) += bank->bronze; GET_MONEY( ch, CURR_COPPER ) += bank->copper; ch_printf( ch, "Deleting... (%s)\r\n", bank->name ); free_bank_to_chars( bank ); unlink_bank( bank ); free_bank( bank ); save_bank( ); ch->pcdata->lastaccountcreated = 0; save_char_obj( ch ); saving_char = NULL; send_to_char( "Your account has successfully been deleted.\r\n", ch ); return; } if ( !bank ) { send_to_char( "There is no account by that name!\r\n", ch ); return; } if ( !str_cmp( arg2, "" ) ) { if ( ch->pcdata->bank == NULL ) { send_to_char( "You don't have any bank account open now.\r\n", ch ); return; } snprintf( buf, MSL, "You have closed the account %s.\r\n", ch->pcdata->bank->name ); send_to_char( buf, ch ); ch->pcdata->bank = NULL; return; } if ( strcmp( crypt( arg2, bank->password ), bank->password ) ) { send_to_char( "Invalid password.\r\n", ch ); return; } snprintf( buf, MSL, "You have opened the account %s.\r\n", bank->name ); send_to_char( buf, ch ); ch->pcdata->bank = bank; }
void do_color( CHAR_DATA* ch, const char* argument) { bool dMatch, cMatch; short count = 0, y = 0; int x; char arg[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH]; char log_buf[MAX_STRING_LENGTH]; dMatch = FALSE; cMatch = FALSE; if( IS_NPC( ch ) ) { send_to_pager( "Only PC's can change colors.\r\n", ch ); return; } if( !argument || argument[0] == '\0' ) { show_colors( ch ); return; } argument = one_argument( argument, arg ); if( !str_cmp( arg, "savetheme" ) && IS_IMMORTAL( ch ) ) { FILE *fp; char filename[256]; if( !argument || argument[0] == '\0' ) { send_to_char( "You must specify a name for this theme to save it.\r\n", ch ); return; } if( strstr( argument, "." ) || strstr( argument, "/" ) || strstr( argument, "\\" ) ) { send_to_char( "Invalid theme name.\r\n", ch ); return; } snprintf( filename, sizeof( filename ), "%s%s", COLOR_DIR, argument ); if( !( fp = fopen( filename, "w" ) ) ) { ch_printf( ch, "Unable to write to color file %s\r\n", filename ); return; } fprintf( fp, "%s", "#COLORTHEME\n" ); fprintf( fp, "Name %s~\n", argument ); fprintf( fp, "MaxColors %d\n", MAX_COLORS ); fprintf( fp, "%s", "Colors " ); for( x = 0; x < MAX_COLORS; ++x ) fprintf( fp, " %d", ch->colors[x] ); fprintf( fp, "%s", "\nEnd\n" ); fclose( fp ); fp = NULL; ch_printf( ch, "Color theme %s saved.\r\n", argument ); return; } if( !str_cmp( arg, "theme" ) ) { FILE *fp; char filename[256]; int max_colors = 0; if( !argument || argument[0] == '\0' ) { show_colorthemes( ch ); return; } if( strstr( argument, "." ) || strstr( argument, "/" ) || strstr( argument, "\\" ) ) { send_to_char( "Invalid theme.\r\n", ch ); return; } snprintf( filename, sizeof( filename ), "%s%s", COLOR_DIR, argument ); if( !( fp = fopen( filename, "r" ) ) ) { ch_printf( ch, "There is no theme called %s.\r\n", argument ); return; } while( !feof( fp ) ) { char *word = fread_word( fp ); if( !str_cmp( word, "MaxColors" ) ) { int temp = fread_number( fp ); max_colors = UMIN( temp, MAX_COLORS ); continue; } if( !str_cmp( word, "Colors" ) ) { for( x = 0; x < max_colors; ++x ) ch->colors[x] = fread_number( fp ); fread_to_eol( fp ); continue; } if( !str_cmp( word, "End" ) ) { fclose( fp ); fp = NULL; ch_printf( ch, "Color theme has been changed to %s.\r\n", argument ); save_char_obj( ch ); return; } } fclose( fp ); fp = NULL; ch_printf( ch, "An error occured while trying to set color theme %s.\r\n", argument ); return; } if( !str_cmp( arg, "ansitest" ) ) { snprintf( log_buf, MAX_STRING_LENGTH, "%sBlack\r\n", ANSI_BLACK ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sDark Red\r\n", ANSI_DRED ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sDark Green\r\n", ANSI_DGREEN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sOrange/Brown\r\n", ANSI_ORANGE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sDark Blue\r\n", ANSI_DBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sPurple\r\n", ANSI_PURPLE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sCyan\r\n", ANSI_CYAN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sGrey\r\n", ANSI_GREY ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sDark Grey\r\n", ANSI_DGREY ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sRed\r\n", ANSI_RED ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sGreen\r\n", ANSI_GREEN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sYellow\r\n", ANSI_YELLOW ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sBlue\r\n", ANSI_BLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sPink\r\n", ANSI_PINK ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sLight Blue\r\n", ANSI_LBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sWhite\r\n", ANSI_WHITE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sBlack\r\n", BLINK_BLACK ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sDark Red\r\n", BLINK_DRED ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sDark Green\r\n", BLINK_DGREEN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sOrange/Brown\r\n", BLINK_ORANGE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sDark Blue\r\n", BLINK_DBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sPurple\r\n", BLINK_PURPLE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sCyan\r\n", BLINK_CYAN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sGrey\r\n", BLINK_GREY ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sDark Grey\r\n", BLINK_DGREY ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sRed\r\n", BLINK_RED ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sGreen\r\n", BLINK_GREEN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sYellow\r\n", BLINK_YELLOW ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sBlue\r\n", BLINK_BLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sPink\r\n", BLINK_PINK ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sLight Blue\r\n", BLINK_LBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sWhite\r\n", BLINK_WHITE ); write_to_buffer( ch->desc, log_buf, 0 ); write_to_buffer( ch->desc, ANSI_RESET, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sBlack\r\n", ANSI_WHITE, BACK_BLACK ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sDark Red\r\n", ANSI_BLACK, BACK_DRED ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sDark Green\r\n", ANSI_BLACK, BACK_DGREEN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sOrange/Brown\r\n", ANSI_BLACK, BACK_ORANGE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sDark Blue\r\n", ANSI_BLACK, BACK_DBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sPurple\r\n", ANSI_BLACK, BACK_PURPLE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sCyan\r\n", ANSI_BLACK, BACK_CYAN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sGrey\r\n", ANSI_BLACK, BACK_GREY ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sDark Grey Background\r\n", ANSI_BLACK, BACK_DGREY ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sRed Background\r\n", ANSI_BLACK, BACK_RED ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sGreen Background\r\n", ANSI_BLACK, BACK_GREEN ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sYellow Background\r\n", ANSI_BLACK, BACK_YELLOW ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sBlue Background\r\n", ANSI_BLACK, BACK_BLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sPink Background\r\n", ANSI_BLACK, BACK_PINK ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sLight Blue Background\r\n", ANSI_BLACK, BACK_LBLUE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sWhite Background\r\n", ANSI_BLACK, BACK_WHITE ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%s%sItalics%s\r\n", ANSI_GREY, ANSI_ITALIC, ANSI_RESET ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sStrikeout%s\r\n", ANSI_STRIKEOUT, ANSI_RESET ); write_to_buffer( ch->desc, log_buf, 0 ); snprintf( log_buf, MAX_STRING_LENGTH, "%sUnderline\r\n", ANSI_UNDERLINE ); write_to_buffer( ch->desc, log_buf, 0 ); write_to_buffer( ch->desc, ANSI_RESET, 0 ); return; } if( !str_prefix( arg, "_reset_" ) ) { reset_colors( ch ); send_to_pager( "All color types reset to default colors.\r\n", ch ); return; } argument = one_argument( argument, arg2 ); if( arg[0] == '\0' ) { send_to_char( "Change which color type?\r\n", ch ); return; } if( !str_prefix( arg, "_all_" ) ) { dMatch = TRUE; count = -1; /* * search for a valid color setting */ for( y = 0; y < 16; y++ ) { if( !str_cmp( arg2, valid_color[y] ) ) { cMatch = TRUE; break; } } } else if( arg2[0] == '\0' ) cMatch = FALSE; else { /* * search for the display type and str_cmp */ for( count = 0; count < MAX_COLORS; count++ ) { if( !str_prefix( arg, pc_displays[count] ) ) { dMatch = TRUE; break; } } if( !dMatch ) { ch_printf( ch, "%s is an invalid color type.\r\n", arg ); send_to_char( "Type color with no arguments to see available options.\r\n", ch ); return; } if( !str_cmp( arg2, "default" ) ) { ch->colors[count] = default_set[count]; ch_printf( ch, "Display %s set back to default.\r\n", pc_displays[count] ); return; } /* * search for a valid color setting */ for( y = 0; y < 16; y++ ) { if( !str_cmp( arg2, valid_color[y] ) ) { cMatch = TRUE; break; } } } if( !cMatch ) { if( arg[0] ) ch_printf( ch, "Invalid color for type %s.\n", arg ); else send_to_pager( "Invalid color.\r\n", ch ); send_to_pager( "Choices are:\r\n", ch ); for( count = 0; count < 16; count++ ) { if( count % 5 == 0 && count != 0 ) send_to_pager( "\r\n", ch ); pager_printf( ch, "%-10s", valid_color[count] ); } pager_printf( ch, "%-10s\r\n", "default" ); return; } else pager_printf( ch, "Color type %s set to color %s.\r\n", count == -1 ? "_all_" : pc_displays[count], valid_color[y] ); if( !str_cmp( argument, "blink" ) ) y += AT_BLINK; if( count == -1 ) { int ccount; for( ccount = 0; ccount < MAX_COLORS; ++ccount ) ch->colors[ccount] = y; set_pager_color( y, ch ); pager_printf( ch, "All color types set to color %s%s.%s\r\n", valid_color[y > AT_BLINK ? y - AT_BLINK : y], y > AT_BLINK ? " [BLINKING]" : "", ANSI_RESET ); } else { ch->colors[count] = y; set_pager_color( count, ch ); if( !str_cmp( argument, "blink" ) ) ch_printf( ch, "Display %s set to color %s [BLINKING]%s\r\n", pc_displays[count], valid_color[y - AT_BLINK], ANSI_RESET ); else ch_printf( ch, "Display %s set to color %s.\r\n", pc_displays[count], valid_color[y] ); } return; }
/* * Update all chars, including mobs. */ void char_update( void ) { CHAR_DATA *ch; CHAR_DATA *ch_next; CHAR_DATA *ch_quit; ch_quit = NULL; /* update save counter */ save_number++; if (save_number > 29) save_number = 0; for ( ch = char_list; ch != NULL; ch = ch_next ) { AFFECT_DATA *paf; AFFECT_DATA *paf_next; ch_next = ch->next; if ( ch->timer > 30 ) ch_quit = ch; if ( ch->position >= POS_STUNNED ) { /* check to see if we need to go home */ if (IS_NPC(ch) && ch->zone != NULL && ch->zone != ch->in_room->area && ch->desc == NULL && ch->fighting == NULL && !IS_AFFECTED(ch,AFF_CHARM) && number_percent() < 5) { act("$n wanders on home.",ch,NULL,NULL,TO_ROOM); extract_char(ch,TRUE); continue; } if ( ch->hit < ch->max_hit ) ch->hit += hit_gain(ch); else ch->hit = ch->max_hit; if ( ch->mana < ch->max_mana ) ch->mana += mana_gain(ch); else ch->mana = ch->max_mana; if ( ch->move < ch->max_move ) ch->move += move_gain(ch); else ch->move = ch->max_move; } if ( ch->position == POS_STUNNED ) update_pos( ch ); if ( !IS_NPC(ch) && ch->level < LEVEL_IMMORTAL ) { OBJ_DATA *obj; if ( ( obj = get_eq_char( ch, WEAR_LIGHT ) ) != NULL && obj->item_type == ITEM_LIGHT && obj->value[2] > 0 ) { if ( --obj->value[2] == 0 && ch->in_room != NULL ) { --ch->in_room->light; act( "$p goes out.", ch, obj, NULL, TO_ROOM ); act( "$p flickers and goes out.", ch, obj, NULL, TO_CHAR ); extract_obj( obj ); } else if ( obj->value[2] <= 5 && ch->in_room != NULL) act("$p flickers.",ch,obj,NULL,TO_CHAR); } if (IS_IMMORTAL(ch)) ch->timer = 0; if ( ++ch->timer >= 12 ) { if ( ch->was_in_room == NULL && ch->in_room != NULL ) { ch->was_in_room = ch->in_room; if ( ch->fighting != NULL ) stop_fighting( ch, TRUE ); act( "$n disappears into the void.", ch, NULL, NULL, TO_ROOM ); send_to_char( "You disappear into the void.\n\r", ch ); if (ch->level > 1) save_char_obj( ch ); char_from_room( ch ); char_to_room( ch, get_room_index( ROOM_VNUM_LIMBO ) ); } } gain_condition( ch, COND_DRUNK, -1 ); gain_condition( ch, COND_FULL, ch->size > SIZE_MEDIUM ? -4 : -2 ); gain_condition( ch, COND_THIRST, -1 ); gain_condition( ch, COND_HUNGER, ch->size > SIZE_MEDIUM ? -2 : -1); } for ( paf = ch->affected; paf != NULL; paf = paf_next ) { paf_next = paf->next; if ( paf->duration > 0 ) { paf->duration--; if (number_range(0,4) == 0 && paf->level > 0) paf->level--; /* spell strength fades with time */ } else if ( paf->duration < 0 ) ; else { if ( paf_next == NULL || paf_next->type != paf->type || paf_next->duration > 0 ) { if ( paf->type > 0 && skill_table[paf->type].msg_off ) { send_to_char( skill_table[paf->type].msg_off, ch ); send_to_char( "\n\r", ch ); } } affect_remove( ch, paf ); } } /* * Careful with the damages here, * MUST NOT refer to ch after damage taken, * as it may be lethal damage (on NPC). */ if (is_affected(ch, gsn_plague) && ch != NULL) { AFFECT_DATA *af, plague; CHAR_DATA *vch; int dam; if (ch->in_room == NULL) continue; act("$n writhes in agony as plague sores erupt from $s skin.", ch,NULL,NULL,TO_ROOM); send_to_char("You writhe in agony from the plague.\n\r",ch); for ( af = ch->affected; af != NULL; af = af->next ) { if (af->type == gsn_plague) break; } if (af == NULL) { REMOVE_BIT(ch->affected_by,AFF_PLAGUE); continue; } if (af->level == 1) continue; plague.where = TO_AFFECTS; plague.type = gsn_plague; plague.level = af->level - 1; plague.duration = number_range(1,2 * plague.level); plague.location = APPLY_STR; plague.modifier = -5; plague.bitvector = AFF_PLAGUE; for ( vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room) { if (!saves_spell(plague.level - 2,vch,DAM_DISEASE) && !IS_IMMORTAL(vch) && !IS_AFFECTED(vch,AFF_PLAGUE) && number_bits(4) == 0) { send_to_char("You feel hot and feverish.\n\r",vch); act("$n shivers and looks very ill.",vch,NULL,NULL,TO_ROOM); affect_join(vch,&plague); } } dam = UMIN(ch->level,af->level/5+1); ch->mana -= dam; ch->move -= dam; damage( ch, ch, dam, gsn_plague,DAM_DISEASE,FALSE); } else if ( IS_AFFECTED(ch, AFF_POISON) && ch != NULL && !IS_AFFECTED(ch,AFF_SLOW)) { AFFECT_DATA *poison; poison = affect_find(ch->affected,gsn_poison); if (poison != NULL) { act( "$n shivers and suffers.", ch, NULL, NULL, TO_ROOM ); send_to_char( "You shiver and suffer.\n\r", ch ); damage(ch,ch,poison->level/10 + 1,gsn_poison, DAM_POISON,FALSE); } } else if ( ch->position == POS_INCAP && number_range(0,1) == 0) { damage( ch, ch, 1, TYPE_UNDEFINED, DAM_NONE,FALSE); } else if ( ch->position == POS_MORTAL ) { damage( ch, ch, 1, TYPE_UNDEFINED, DAM_NONE,FALSE); } } /* * Autosave and autoquit. * Check that these chars still exist. */ for ( ch = char_list; ch != NULL; ch = ch_next ) { ch_next = ch->next; if (ch->desc != NULL && ch->desc->descriptor % 30 == save_number) { save_char_obj(ch); } if (ch == ch_quit) { do_function(ch, &do_quit, "" ); } } return; }
void do_hotreboot(CHAR_DATA * ch, char *argument) { FILE *fp; DESCRIPTOR_DATA *d, *d_next; char buf[100], buf2[100], buf3[100]; fp = fopen(HOTREBOOT_FILE, "w"); if(!fp) { send_to_char("hotreboot file not writeable, aborted.\n\r", ch); fpReserve = fopen(NULL_FILE, "r"); perror("do_hotreboot:fopen"); return; } if(argument && !str_cmp(argument,"INFINITE LOOP!")) { sprintf(buf, "[HotReboot by Godwars - Infinite Loop!]\n\r"); } if(argument && argument[0] != '\0') { sprintf(buf, "[HotReboot by Godwars - Crash!]\n\r"); } else { do_restore(ch, "all"); prepare_players(); write_kingdoms(); sprintf(buf, "[HotReboot by %s - You will automatically reconnect]\n\r", ch->name); } /* For each playing descriptor, save its state */ for(d = descriptor_list; d; d = d_next) { CHAR_DATA *och = CH(d); d_next = d->next; /* We delete from the list , so need to save this */ if(!d->character || d->connected != CON_PLAYING || och->level == 1) /* drop those logging on */ { write_to_descriptor(d->descriptor, "\n\rSorry, we are rebooting. Come back in a few minutes.\n\r", 0); close_socket2(d, FALSE); /* throw'em out */ } else { fprintf(fp, "%li %s %s\n", d->descriptor, och->name, d->host); save_char_obj(och); write_to_descriptor(d->descriptor, buf, 0); } } fprintf(fp, "-1\n\n"); fclose(fp); if((fp = fopen(OLDUPTIME_FILE, "w")) != 0) { fprintf(fp, "%.0f\n", get_uptime()); fclose(fp); } else { unlink(OLDUPTIME_FILE); } fclose(fpReserve); /* exec - descriptors are inherited */ sprintf(buf, "%li", port); sprintf(buf2, "%li", control); sprintf(buf3, "%li", rebootnum); #ifndef WIN32 execl(EXE_FILE, "Merc", buf, "hotreboot", buf2, buf3, (char *) 0); #endif /* Failed - sucessful exec will not return */ perror("do_hotreboot: execl"); send_to_char("hotreboot FAILED!\n\r", ch); /* Here you might want to reopen fpReserve */ fpReserve = fopen(NULL_FILE, "r"); }
void do_rename (CHAR_DATA* ch, char* argument) { char old_name[MAX_INPUT_LENGTH], new_name[MAX_INPUT_LENGTH], strsave [MAX_INPUT_LENGTH]; CHAR_DATA* victim; FILE* file; argument = one_argument(argument, old_name); /* find new/old name */ one_argument (argument, new_name); /* Trivial checks */ if (!old_name[0]) { send_to_char ("Rename who?\n\r",ch); return; } victim = get_char_world (ch, old_name); if (!victim) { send_to_char ("There is no such a person online.\n\r",ch); return; } if (IS_NPC(victim)) { send_to_char ("You cannot use Rename on NPCs.\n\r",ch); return; } /* allow rename self new_name,but otherwise only lower level */ if ( (victim != ch) && (get_trust (victim) >= get_trust (ch)) ) { send_to_char ("You failed.\n\r",ch); return; } if (!victim->desc || (victim->desc->connected != CON_PLAYING) ) { send_to_char ("This player has lost his link or is inside a pager or the like.\n\r",ch); return; } if (!new_name[0]) { send_to_char ("Rename to what new name?\n\r",ch); return; } /* Insert check for clan here!! */ /* if (victim->clan) { send_to_char ("This player is member of a clan, remove him from there first.\n\r",ch); return; } */ if (!check_parse_name(new_name)) { send_to_char ("The new name is illegal.\n\r",ch); return; } /* First, check if there is a player named that off-line */ #if !defined(machintosh) && !defined(MSDOS) sprintf( strsave, "%s%s%s%s", PLAYER_DIR, initial( new_name ), "/", capitalize( new_name ) ); #else sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( new_name ) ); #endif fclose (fpReserve); /* close the reserve file */ file = fopen (strsave, "r"); /* attempt to to open pfile */ if (file) { send_to_char ("A player with that name already exists!\n\r",ch); fclose (file); fpReserve = fopen( NULL_FILE, "r" ); /* is this really necessary these days? */ return; } fpReserve = fopen( NULL_FILE, "r" ); /* reopen the extra file */ /* Check .gz file ! */ #if !defined(machintosh) && !defined(MSDOS) sprintf( strsave, "%s%s%s%s.gz", PLAYER_DIR, initial( new_name ), "/", capitalize( new_name ) ); #else sprintf( strsave, "%s%s.gz", PLAYER_DIR, capitalize( new_name ) ); #endif fclose (fpReserve); /* close the reserve file */ file = fopen (strsave, "r"); /* attempt to to open pfile */ if (file) { send_to_char ("A player with that name already exists in a compressed file!\n\r",ch); fclose (file); fpReserve = fopen( NULL_FILE, "r" ); return; } fpReserve = fopen( NULL_FILE, "r" ); /* reopen the extra file */ if (get_char_world(ch,new_name)) /* check for playing level-1 non-saved */ { send_to_char ("A player with the name you specified already exists!\n\r",ch); return; } /* Save the filename of the old name */ #if !defined(machintosh) && !defined(MSDOS) sprintf( strsave, "%s%s%s%s", PLAYER_DIR, initial( victim->name ), "/", capitalize( victim->name ) ); #else sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( victim->name ) ); #endif /* Rename the character and save him to a new file */ /* NOTE: Players who are level 1 do NOT get saved under a new name */ free_string (victim->name); victim->name = str_dup (capitalize(new_name)); save_char_obj (victim); /* unlink the old file */ unlink (strsave); /* unlink does return a value.. but we do not care */ /* That's it! */ send_to_char ("Character renamed.\n\r",ch); victim->position = POS_STANDING; /* I am laaazy */ act ("$n has renamed you to $N!",ch,NULL,victim,TO_VICT); } /* do_rename */
void do_grant( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg1 [MAX_INPUT_LENGTH]; char arg2 [MAX_INPUT_LENGTH]; int inpart = 0; int cost = 0; smash_tilde(argument); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_DROW)) { send_to_char("Huh?\n\r",ch); return; } if ( arg1[0] == '\0' || arg2[0] == '\0' ) { send_to_char( "Syntax: Grant <person> <power>\n\r", ch ); send_to_char("#pDrowfire #0(#r2500#0)#n, #pDarkness #0(#r7500#0)#n, #pDrowpoison #0(#r2500#0)#n.\n\r",ch); send_to_char("#pDrowsight #0(#r5000#0)#n, #pDrowshield #0(#r5000#0)#n, #pLevitation #0(#r1000#0)#n.\n\r", ch ); send_to_char("#pShadowwalk #0(#r10000#0)#n, #pGarotte #0(#r5000#0)#n, #pSpiderarms #0(#r25000#0)#n.\n\r", ch ); send_to_char("#pDrowhate #0(#r20000#0)#n, #pSpiderform #0(#r25000#0)#n, #pWeb #0(#r5000#0)#n.\n\r",ch ); send_to_char("#pDgarotte #0(#r2500#0)#n, #pConfuse #0(#r2500#0)#n, #pGlamour #0(#r5000#0)#n.\n\r", ch ); send_to_char("#pEarthshatter #0(#r7500#0)#n, #pSpeed #0(#r7500#0)#n, #pToughskin #0(#r7500#0)#n.\n\r", ch ); send_to_char("#pDarktendrils #0(#r25000#0)#n., #pFightdance#0 (#r10000#0)#n\n\r", ch ); send_to_char("Warrior (0), Mage (0), Cleric (0).\n\r", ch ); return; } if ( ( victim = get_char_world( ch, arg1 ) ) == NULL ) { send_to_char( "Nobody by that name.\n\r", ch ); return; } if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if (!IS_CLASS(victim, CLASS_DROW)) { send_to_char("Only on drows.\n\r", ch ); return;} if (!str_cmp(arg2,"mage") || !str_cmp(arg2,"warrior") || !str_cmp(arg2, "cleric" )) { if (victim->generation < 3 ) { send_to_char("Not on them!\n\r", ch ); return;} if (( IS_SET(victim->special, SPC_DROW_WAR) || IS_SET(victim->special, SPC_DROW_MAG) || IS_SET(victim->special, SPC_DROW_CLE)) && ch->level < 6 && ch->generation > 2) { send_to_char( "They already have a profession.\n\r", ch ); return;} if (!str_cmp(arg2, "mage")) SET_BIT(victim->special, SPC_DROW_MAG); else if (!str_cmp(arg2, "cleric")) SET_BIT(victim->special, SPC_DROW_CLE); else if (!str_cmp(arg2, "warrior")) SET_BIT(victim->special, SPC_DROW_WAR); send_to_char("You give them a profession.\n\r", ch ); send_to_char("You have been given a profession.\n\r", victim); save_char_obj(victim); return; } if (!str_cmp(arg2,"drowfire")) {inpart = DPOWER_DROWFIRE; cost = 2500;} else if (!str_cmp(arg2,"darkness")) {inpart = DPOWER_DARKNESS; cost= 7500;} else if (!str_cmp(arg2,"drowsight")) {inpart = DPOWER_DROWSIGHT; cost= 5000;} else if (!str_cmp(arg2,"spiderarms")) {inpart = DPOWER_ARMS; cost = 25000;} else if (!str_cmp(arg2,"web")) {inpart = DPOWER_WEB; cost = 5000;} else if (!str_cmp(arg2,"spiderform")) {inpart = DPOWER_SPIDERFORM; cost = 25000;} else if (!str_cmp(arg2,"drowhate")) {inpart = DPOWER_DROWHATE; cost = 20000;} else if (!str_cmp(arg2,"drowshield")) {inpart = DPOWER_DROWSHIELD; cost = 5000;} else if (!str_cmp(arg2,"levitation")) {inpart = DPOWER_LEVITATION; cost = 1000;} else if (!str_cmp(arg2,"shadowwalk")) {inpart = DPOWER_SHADOWWALK; cost = 10000;} else if (!str_cmp(arg2,"garotte")) {inpart = DPOWER_GAROTTE; cost = 5000;} else if (!str_cmp(arg2,"dgarotte")) {inpart = DPOWER_DGAROTTE; cost = 2500;} else if (!str_cmp(arg2,"drowpoison")) {inpart = DPOWER_DROWPOISON; cost = 2500;} else if (!str_cmp(arg2,"glamour")) {inpart = DPOWER_GLAMOUR; cost = 5000;} else if (!str_cmp(arg2,"confuse")) {inpart = DPOWER_CONFUSE; cost = 2500;} else if (!str_cmp(arg2,"earthshatter")) {inpart = DPOWER_EARTHSHATTER; cost = 7500;} else if (!str_cmp(arg2,"speed")) {inpart = DPOWER_SPEED; cost = 7500;} else if (!str_cmp(arg2,"toughskin")) {inpart = DPOWER_TOUGHSKIN; cost =7500;} else if (!str_cmp(arg2,"darktendrils")) {inpart = DPOWER_DARKTENDRILS; cost =25000;} else if (!str_cmp(arg2,"fightdance")) {inpart = DPOWER_FIGHTDANCE; cost =10000;} else { send_to_char( "Syntax: Grant <person> <power>\n\r", ch ); send_to_char("#pDrowfire #0(#r2500#0)#n, #pDarkness #0(#r7500#0)#n, #pDrowpoison #0(#r2500#0)#n.\n\r",ch); send_to_char("#pDrowsight #0(#r5000#0)#n, #pDrowshield #0(#r5000#0)#n, #pLevitation #0(#r1000#0)#n.\n\r", ch ); send_to_char("#pShadowwalk #0(#r10000#0)#n, #pGarotte #0(#r5000#0)#n, #pSpiderarms #0(#r25000#0)#n.\n\r", ch ); send_to_char("#pDrowhate #0(#r20000#0)#n, #pSpiderform #0(#r25000#0)#n, #pWeb #0(#r5000#0)#n.\n\r",ch ); send_to_char("#pDgarotte #0(#r2500#0)#n, #pConfuse #0(#r2500#0)#n, #pGlamour #0(#r5000#0)#n.\n\r", ch ); send_to_char("#pEarthshatter #0(#r7500#0)#n, #pSpeed #0(#r7500#0)#n, #pToughskin #0(#r7500#0)#n.\n\r", ch ); send_to_char("#pDarktendrils #0(#r25000#0)#n., #pFightdance#0 (#r10000#0)#n\n\r", ch ); send_to_char("Warrior (0), Mage (0), Cleric (0).\n\r", ch ); return; } if (!(ch==victim)) cost *=5; if (IS_SET(victim->pcdata->powers[1], inpart)) { send_to_char("They have already got that power.\n\r",ch); return; } if( !IS_CLASS(victim, CLASS_DROW) ) { stc( "You can not grant powers to Non Drows.\n\r",ch); return; } if (ch->pcdata->stats[DROW_POWER] < cost) { send_to_char("You have insufficient power to grant that gift.\n\r",ch); return; } SET_BIT(victim->pcdata->powers[1], inpart); ch->pcdata->stats[DROW_POWER] -= cost; if (victim != ch) send_to_char("You have been granted a gift from your matron!\n\r",victim); send_to_char("Ok.\n\r",ch); if (victim != ch) save_char_obj(ch); save_char_obj(victim); return; }
/* Warm reboot stuff, gotta make sure to thank Erwin for this :) */ void do_hotboot( CHAR_DATA * ch, const char *argument ) { FILE *fp; CHAR_DATA *victim = NULL; DESCRIPTOR_DATA *d, *de_next; char buf[100], buf2[100], buf3[100]; extern int control; int count = 0; bool found = FALSE; for( d = first_descriptor; d; d = d->next ) { if( ( d->connected == CON_PLAYING || d->connected == CON_EDITING ) && ( victim = d->character ) != NULL && !IS_NPC( victim ) && victim->in_room && victim->fighting && victim->top_level >= 1 && victim->top_level <= MAX_LEVEL ) { found = TRUE; count++; } } if( found ) { ch_printf( ch, "Cannot hotboot at this time. There are %d combats in progress.\r\n", count ); return; } found = FALSE; for( d = first_descriptor; d; d = d->next ) { if( d->connected == CON_EDITING && d->character ) { found = TRUE; break; } } if( found ) { send_to_char( "Cannot hotboot at this time. Someone is using the line editor.\r\n", ch ); return; } sprintf( log_buf, "Hotboot initiated by %s.", ch->name ); log_string( log_buf ); fp = fopen( HOTBOOT_FILE, "w" ); if( !fp ) { send_to_char( "Hotboot file not writeable, aborted.\r\n", ch ); bug( "Could not write to hotboot file: %s. Hotboot aborted.", HOTBOOT_FILE ); perror( "do_copyover:fopen" ); return; } /* * And this one here will save the status of all objects and mobs in the game. * * This really should ONLY ever be used here. The less we do stuff like this the better. */ save_world( ch ); #ifdef OLC_SHUTTLE { SHUTTLE_DATA *tshuttle; for( tshuttle = first_shuttle; tshuttle; tshuttle = tshuttle->next ) save_shuttle( tshuttle ); } #endif log_string( "Saving player files and connection states...." ); if( ch && ch->desc ) write_to_descriptor( ch->desc, "\033[0m", 0 ); sprintf( buf, "\r\nYou feel a great disturbance in the Force." ); /* * For each playing descriptor, save its state */ for( d = first_descriptor; d; d = de_next ) { CHAR_DATA *och = CH( d ); de_next = d->next; /* We delete from the list , so need to save this */ if( !d->character || d->connected < CON_PLAYING ) /* drop those logging on */ { write_to_descriptor( d, "\r\nSorry, we are rebooting. Come back in a few minutes.\r\n", 0 ); close_socket( d, FALSE ); /* throw'em out */ } else { /* For test purposes flush_buffer(d, TRUE);*/ fprintf( fp, "%d %d %d %d %d %s %s\n", d->can_compress, d->descriptor, och->in_room->vnum, d->port, d->idle, och->name, d->host ); /* * One of two places this gets changed */ och->pcdata->hotboot = TRUE; save_char_obj( och ); write_to_descriptor( d, buf, 0 ); compressEnd( d ); } } fprintf( fp, "%s", "-1" ); FCLOSE( fp ); #ifdef IMC imc_hotboot( ); #endif /* * added this in case there's a need to debug the contents of the various files */ if( argument && !str_cmp( argument, "debug" ) ) { log_string( "Hotboot debug - Aborting before execl" ); return; } log_string( "Executing hotboot...." ); /* * exec - descriptors are inherited */ snprintf( buf, 100, "%d", port ); snprintf( buf2, 100, "%d", control ); #ifdef IMC if( this_imcmud ) snprintf( buf3, 100, "%d", this_imcmud->desc ); else strncpy( buf3, "-1", 100 ); #else strncpy( buf3, "-1", 100 ); #endif dlclose( sysdata.dlHandle ); execl( EXE_FILE, "swreality", buf, "hotboot", buf2, buf3, ( char * )NULL ); /* * Failed - sucessful exec will not return */ perror( "do_hotboot: execl" ); sysdata.dlHandle = dlopen( NULL, RTLD_LAZY ); if( !sysdata.dlHandle ) { bug( "%s", "FATAL ERROR: Unable to reopen system executable handle!" ); exit( 1 ); } bug( "%s", "Hotboot execution failed!!" ); send_to_char( "Hotboot FAILED!\r\n", ch ); }
void do_quit( CHAR_DATA *ch, char *argument ) { DESCRIPTOR_DATA *d; char buf[MAX_INPUT_LENGTH]; if ( IS_NPC(ch) ) return; if ( check_fighting( ch ) ) { send_to_char( "No way! You are fighting.\n\r", ch ); return; } if ( ch->position < POS_STUNNED ) { send_to_char( "You're not DEAD yet.\n\r", ch ); return; } if ( is_affected( ch, gsn_noquit ) && !IS_IMMORTAL( ch ) ) { send_to_char("You are a bit too restless to quit just yet.\n\r", ch ); return; } if ( ch->in_room && !IS_SET( ch->in_room->room_flags, ROOM_RENT ) && !IS_IMMORTAL( ch ) ) { /* Urik Tavern special tell. */ if ( ch->in_room == get_room_index( ROOM_VNUM_TEMPLE ) ) { send_to_char("You can't quit here.\n\rTry going west, then quit.\n\r", ch ); return; } send_to_char("You can't quit here.\n\r", ch ); return; } sprintf(buf, "%s",(char *) ctime( ¤t_time ) ); ch->time = buf; send_to_char( "Farewell.\n\r", ch ); if (!IS_SET(ch->act, PLR_WIZINVIS) ){ act( "$n departs from the area.", ch, NULL, NULL, NULL, NULL, TO_ROOM, SENSE_SIXTH ); } sprintf( log_buf, "%s has quit.", ch->name ); log_string( log_buf ); /* * After extract_char the ch is no longer valid! */ // save_char_obj( ch ); // d = ch->desc; // extract_char( ch, TRUE ); save_char_obj( ch ); d = ch->desc; extract_char( ch, TRUE ); if ( d != NULL ) close_socket( d ); /* New quit code, needs a lot of working, causing wierd bugs. */ /* if ( d != NULL ) { extern char *help_greeting; write_to_buffer(d, help_greeting, 0 ); d->connected = CON_MAIN_MENU; return; } */ return; }