void do_equipment( CHAR_DATA* ch, const char* argument) { OBJ_DATA *obj; int iWear; bool found; set_char_color( AT_RED, ch ); send_to_char( "You are using:\r\n", ch ); found = FALSE; set_char_color( AT_OBJECT, ch ); for( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for( obj = ch->first_carrying; obj; obj = obj->next_content ) if( obj->wear_loc == iWear ) { if( ( !IS_NPC( ch ) ) && ( ch->race > 0 ) && ( ch->race < MAX_PC_RACE ) ) send_to_char( race_table[ch->race]->where_name[iWear], ch ); else send_to_char( where_name[iWear], ch ); if( can_see_obj( ch, obj ) ) { send_to_char( format_obj_to_char( obj, ch, TRUE ), ch ); send_to_char( "\r\n", ch ); } else send_to_char( "something.\r\n", ch ); found = TRUE; } } if( !found ) send_to_char( "Nothing.\r\n", ch ); }
void do_title( CHAR_DATA* ch, const char* argument) { if( IS_NPC( ch ) ) return; set_char_color( AT_SCORE, ch ); if( ch->level < 5 ) { send_to_char( "Sorry... you must be at least level 5 to set your title...\r\n", ch ); return; } if( IS_SET( ch->pcdata->flags, PCFLAG_NOTITLE ) ) { set_char_color( AT_IMMORT, ch ); send_to_char( "The Gods prohibit you from changing your title.\r\n", ch ); return; } if( argument[0] == '\0' ) { send_to_char( "Change your title to what?\r\n", ch ); return; } char title[50]; mudstrlcpy(title, argument, 50); smash_tilde( title ); set_title( ch, title ); send_to_char( "Ok.\r\n", ch ); }
void do_inventory( CHAR_DATA * ch, const char *argument ) { set_char_color( AT_RED, ch ); send_to_char( "You are carrying:\r\n", ch ); show_list_to_char( ch->first_carrying, ch, TRUE, TRUE ); return; }
void do_balance( CHAR_DATA * ch, char *argument ) { CHAR_DATA *banker; char buf[MAX_STRING_LENGTH]; if( !( banker = find_banker( ch ) ) ) { send_to_char( "&WYou're not in a bank!&w\r\n", ch ); return; } if( IS_NPC( ch ) ) { sprintf( buf, "Sorry, %s, we don't do business with mobs.", ch->short_descr ); do_say( banker, buf ); return; } set_char_color( AT_WHITE, ch ); send_to_char( "Your account value is:\r\n", ch ); sprintf( buf, "&YGold: %ld.\r\n&WSilver: %ld.\r\n&RCopper: %ld.\r\n\r\n", ch->pcdata->gbalance, ch->pcdata->sbalance, ch->pcdata->balance ); send_to_char( buf, ch ); return; }
void set_char(char c, void* form, void *attr, u_char color, u_char place) { set_char_form(c, form, place); if (attr) set_char_attr(c, attr, place); else set_char_color(c, color, place); }
/* * Il menu principale. */ void redit_disp_menu( DESCRIPTOR_DATA *d ) { char buf[MSL]; ROOM_DATA *room = d->character->dest_buf; char *sect; switch ( room->sector ) { default: sect = "None"; break; case SECTOR_INSIDE: sect = "Inside"; break; case SECTOR_CITY: sect = "City"; break; case SECTOR_FIELD: sect = "Field"; break; case SECTOR_FOREST: sect = "Forest"; break; case SECTOR_HILLS: sect = "Hills"; break; case SECTOR_MOUNTAIN: sect = "Mountains"; break; case SECTOR_WATER_SWIM: sect = "Swim"; break; case SECTOR_WATER_NOSWIM: sect = "Noswim"; break; case SECTOR_UNDERWATER: sect = "Underwater"; break; case SECTOR_AIR: sect = "Air"; break; case SECTOR_DESERT: sect = "Desert"; break; case SECTOR_OCEANFLOOR: sect = "Oceanfloor"; break; case SECTOR_UNDERGROUND: sect = "Underground"; break; } write_to_buffer( d, "50\x1B[;H\x1B[2J", 0 ); sprintf( buf, "&w-- Room number : [&c%d&w] Room area: [&c%-30.30s&w]\r\n" "&g1&w) Name : &O%s\r\n" "&g2&w) Description :\r\n&O%s" "&g3&w) Room flags : &c%s\r\n" "&g4&w) Sector type : &c%s\r\n" "&g5&w) Tunnel : &c%d\r\n" "&g6&w) TeleDelay : &c%d\r\n" "&g7&w) TeleVnum : &c%d\r\n" "&gA&w) Exit menu\r\n" "&gB&w) Extra descriptions menu\r\n" "&gQ&w) Quit\r\n" "Enter choice : ", OLC_NUM(d), (room->area) ? room->area->name : "None???", room->name, room->description, code_bit(NULL, room->flags, CODE_ROOM), sect, room->tunnel, room->tele_delay, room->tele_vnum ); set_char_color( AT_PLAIN, d->character ); send_to_char( d->character, buf ); OLC_MODE(d) = REDIT_MAIN_MENU; }
void do_prompt( CHAR_DATA * ch, const char *argument ) { char arg[MAX_INPUT_LENGTH]; set_char_color( AT_GREY, ch ); if ( IS_NPC( ch ) ) { send_to_char( "NPC's can't change their prompt..\r\n", ch ); return; } smash_tilde( argument ); one_argument( argument, arg ); if ( !*arg || !str_cmp( arg, "display" ) ) { send_to_char( "Your current prompt string:\r\n", ch ); set_char_color( AT_WHITE, ch ); ch_printf( ch, "%s\r\n", !str_cmp( ch->pcdata->prompt, "" ) ? "(default prompt)" : ch->pcdata->prompt ); set_char_color( AT_GREY, ch ); send_to_char( "Type 'help prompt' for information on changing your prompt.\r\n", ch ); return; } send_to_char( "Replacing old prompt of:\r\n", ch ); set_char_color( AT_WHITE, ch ); ch_printf( ch, "%s\r\n", !str_cmp( ch->pcdata->prompt, "" ) ? "(default prompt)" : ch->pcdata->prompt ); if ( ch->pcdata->prompt ) STRFREE( ch->pcdata->prompt ); char prompt[128]; mudstrlcpy( prompt, argument, 128 ); /* * Can add a list of pre-set prompts here if wanted.. perhaps * 'prompt 1' brings up a different, pre-set prompt */ if ( !str_cmp( arg, "default" ) ) ch->pcdata->prompt = STRALLOC( "" ); else ch->pcdata->prompt = STRALLOC( prompt ); return; }
void do_timecmd( CHAR_DATA* ch, const char* argument) { struct timeval sttime; struct timeval etime; static bool timing; extern CHAR_DATA *timechar; char arg[MAX_INPUT_LENGTH]; send_to_char( "Timing\r\n", ch ); if( timing ) return; one_argument( argument, arg ); if( !*arg ) { send_to_char( "No command to time.\r\n", ch ); return; } if( !str_cmp( arg, "update" ) ) { if( timechar ) send_to_char( "Another person is already timing updates.\r\n", ch ); else { timechar = ch; send_to_char( "Setting up to record next update loop.\r\n", ch ); } return; } set_char_color( AT_PLAIN, ch ); send_to_char( "Starting timer.\r\n", ch ); timing = TRUE; gettimeofday( &sttime, NULL ); interpret( ch, argument ); gettimeofday( &etime, NULL ); timing = FALSE; set_char_color( AT_PLAIN, ch ); send_to_char( "Timing complete.\r\n", ch ); subtract_times( &etime, &sttime ); ch_printf( ch, "Timing took %ld.%06ld seconds.\r\n", etime.tv_sec, etime.tv_usec ); return; }
void do_bounties( CHAR_DATA * ch, char *argument ) { BOUNTY_DATA *bounty; int count = 0; set_char_color( AT_WHITE, ch ); send_to_char( "\n\rBounty Amount\n\r", ch ); for( bounty = first_disintegration; bounty; bounty = bounty->next ) { set_char_color( AT_RED, ch ); ch_printf( ch, "%-27s %-14ld\n\r", bounty->target, bounty->amount ); count++; } if( !count ) { set_char_color( AT_GREY, ch ); send_to_char( "There are no bounties set at this time.\n\r", ch ); return; } }
DO_RET do_calendar( CHAR_DATA *ch, char *argument ) { set_char_color( AT_PLAIN, ch ); send_to_char( ch, get_calendar_string() ); if ( IS_ADMIN(ch) ) { /* (FF) bisognerebbe farle bene rimandando un \r\n ma bisogna togliere quindi a tutti l'\n finale. */ ch_printf( ch, "\r\n%s : %21.21s\r\n", MUD_NAME, str_boot_time ); ch_printf( ch, "Ora Locale Server: %21.21s\r\n", friendly_ctime(¤t_time) ); ch_printf( ch, "Prossimo reboot previsto: %s", reboot_time ); } }
void do_repairshops( CHAR_DATA *ch, char *argument ) { REPAIR_DATA *repair; if ( !first_repair ) { send_to_char( "There are no repair shops.\n\r", ch ); return; } set_char_color( AT_NOTE, ch ); for ( repair = first_repair; repair; repair = repair->next ) ch_printf( ch, "Keeper: %5d Profit: %3d Type: %d Open: %2d Close: %2d Fix: %2d %2d %2d\n\r", repair->keeper, repair->profit_fix, repair->shop_type, repair->open_hour, repair->close_hour, repair->fix_type[0], repair->fix_type[1], repair->fix_type[2] ); return; }
void do_boards( CHAR_DATA * ch, char *argument ) { BOARD_DATA *board = NULL; if( !first_board ) { send_to_char( "There are no boards.\r\n", ch ); return; } set_char_color( AT_NOTE, ch ); for( board = first_board; board; board = board->next ) ch_printf( ch, "%-16s Vnum: %5d Read: %2d Post: %2d Rmv: %2d Max: %2d Posts: %d Type: %d\r\n", board->note_file, board->board_obj, board->min_read_level, board->min_post_level, board->min_remove_level, board->max_posts, board->num_posts, board->type ); }
void do_shops( CHAR_DATA *ch, char *argument ) { SHOP_DATA *shop; if ( !first_shop ) { send_to_char( "There are no shops.\n\r", ch ); return; } set_char_color( AT_NOTE, ch ); for ( shop = first_shop; shop; shop = shop->next ) ch_printf( ch, "Keeper: %5d Buy: %3d Sell: %3d Open: %2d Close: %2d Buy: %2d %2d %2d %2d %2d\n\r", shop->keeper, shop->profit_buy, shop->profit_sell, shop->open_hour, shop->close_hour, shop->buy_type[0], shop->buy_type[1], shop->buy_type[2], shop->buy_type[3], shop->buy_type[4] ); return; }
/* -Thoric * Display your current exp, level, and surrounding level exp requirements */ void do_level( CHAR_DATA * ch, const char *argument ) { char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; int x, lowlvl, hilvl; if ( ch->level == 1 ) lowlvl = 1; else lowlvl = UMAX( 2, ch->level - 5 ); hilvl = URANGE( ch->level, ch->level + 5, MAX_LEVEL ); set_char_color( AT_SCORE, ch ); ch_printf( ch, "\r\nExperience required, levels %d to %d:\r\n______________________________________________\r\n\r\n", lowlvl, hilvl ); snprintf( buf, MAX_STRING_LENGTH, " exp (Current: %12s)", num_punct( ch->exp ) ); snprintf( buf2, MAX_STRING_LENGTH, " exp (Needed: %12s)", num_punct( exp_level( ch, ch->level + 1 ) - ch->exp ) ); for ( x = lowlvl; x <= hilvl; x++ ) ch_printf( ch, " (%2d) %12s%s\r\n", x, num_punct( exp_level( ch, x ) ), ( x == ch->level ) ? buf : ( x == ch->level + 1 ) ? buf2 : " exp" ); send_to_char( "______________________________________________\r\n", ch ); }
/* Ripped off do_description for whois bio's -- Scryn*/ void do_bio( CHAR_DATA* ch, const char* argument) { if( IS_NPC( ch ) ) { send_to_char( "Mobs cannot set a bio.\r\n", ch ); return; } if( ch->level < 5 ) { set_char_color( AT_SCORE, ch ); send_to_char( "You must be at least level five to write your bio...\r\n", ch ); return; } if( !ch->desc ) { bug( "%s", "do_bio: no descriptor" ); return; } switch ( ch->substate ) { default: bug( "%s", "do_bio: illegal substate" ); return; case SUB_RESTRICTED: send_to_char( "You cannot use this command from within another command.\r\n", ch ); return; case SUB_NONE: ch->substate = SUB_PERSONAL_BIO; ch->dest_buf = ch; start_editing( ch, ch->pcdata->bio ); return; case SUB_PERSONAL_BIO: STRFREE( ch->pcdata->bio ); ch->pcdata->bio = copy_buffer( ch ); stop_editing( ch ); return; } }
/* 1997, Blodkai */ void do_remains( CHAR_DATA* ch, const char* argument) { char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; bool found = FALSE; if( IS_NPC( ch ) ) return; set_char_color( AT_MAGIC, ch ); if( !ch->pcdata->deity ) { send_to_pager( "You have no deity from which to seek such assistance...\r\n", ch ); return; } if( ch->pcdata->favor < ch->level * 2 ) { send_to_pager( "Your favor is insufficient for such assistance...\r\n", ch ); return; } pager_printf( ch, "%s appears in a vision, revealing that your remains... ", ch->pcdata->deity->name ); snprintf( buf, MAX_STRING_LENGTH, "the corpse of %s", ch->name ); for( obj = first_object; obj; obj = obj->next ) { if( obj->in_room && !str_cmp( buf, obj->short_descr ) && ( obj->pIndexData->vnum == OBJ_VNUM_CORPSE_PC ) ) { found = TRUE; pager_printf( ch, "\r\n - at %s will endure for %d ticks", obj->in_room->name, obj->timer ); } } if( !found ) send_to_pager( " no longer exist.\r\n", ch ); else { send_to_pager( "\r\n", ch ); ch->pcdata->favor -= ch->level * 2; } return; }
bool check_social( CHAR_DATA * ch, const char *command, const char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim, *victim_next; SOCIALTYPE *social; CHAR_DATA *removed[128]; /* What are the chances of more than 128? */ ROOM_INDEX_DATA *room; int i = 0, k = 0; if( ( social = find_social( command ) ) == NULL ) return FALSE; if( !IS_NPC( ch ) && xIS_SET( ch->act, PLR_NO_EMOTE ) ) { send_to_char( "You are anti-social!\r\n", ch ); return TRUE; } switch ( ch->position ) { case POS_DEAD: send_to_char( "Lie still; you are DEAD.\r\n", ch ); return TRUE; case POS_INCAP: case POS_MORTAL: send_to_char( "You are hurt far too bad for that.\r\n", ch ); return TRUE; case POS_STUNNED: send_to_char( "You are too stunned to do that.\r\n", ch ); return TRUE; case POS_SLEEPING: /* * I just know this is the path to a 12" 'if' statement. :( * But two players asked for it already! -- Furey */ if( !str_cmp( social->name, "snore" ) ) break; send_to_char( "In your dreams, or what?\r\n", ch ); return TRUE; } /* * Search room for chars ignoring social sender and * remove them from the room until social has been * completed */ room = ch->in_room; for( victim = ch->in_room->first_person; victim; victim = victim_next ) { if( i == 127 ) break; victim_next = victim->next_in_room; if( is_ignoring( victim, ch ) ) { if( !IS_IMMORTAL( ch ) || get_trust( victim ) > get_trust( ch ) ) { removed[i] = victim; i++; UNLINK( victim, room->first_person, room->last_person, next_in_room, prev_in_room ); } else { set_char_color( AT_IGNORE, victim ); ch_printf( victim, "You attempt to ignore %s," " but are unable to do so.\r\n", ch->name ); } } } one_argument( argument, arg ); victim = NULL; if( arg[0] == '\0' ) { act( AT_SOCIAL, social->others_no_arg, ch, NULL, victim, TO_ROOM ); act( AT_SOCIAL, social->char_no_arg, ch, NULL, victim, TO_CHAR ); } else if( ( victim = get_char_room( ch, arg ) ) == NULL ) { /* * If they aren't in the room, they may be in the list of * people ignoring... */ if( i != 0 ) { for( k = 0, victim = removed[0]; k < i; k++, victim = removed[k] ) { if( nifty_is_name( victim->name, arg ) || nifty_is_name_prefix( arg, victim->name ) ) { set_char_color( AT_IGNORE, ch ); ch_printf( ch, "%s is ignoring you.\r\n", victim->name ); break; } } } if( !victim ) send_to_char( "They aren't here.\r\n", ch ); } else if( victim == ch ) { act( AT_SOCIAL, social->others_auto, ch, NULL, victim, TO_ROOM ); act( AT_SOCIAL, social->char_auto, ch, NULL, victim, TO_CHAR ); } else { act( AT_SOCIAL, social->others_found, ch, NULL, victim, TO_NOTVICT ); act( AT_SOCIAL, social->char_found, ch, NULL, victim, TO_CHAR ); act( AT_SOCIAL, social->vict_found, ch, NULL, victim, TO_VICT ); if( !IS_NPC( ch ) && IS_NPC( victim ) && !IS_AFFECTED( victim, AFF_CHARM ) && IS_AWAKE( victim ) && !HAS_PROG( victim->pIndexData, ACT_PROG ) ) { switch ( number_bits( 4 ) ) { case 0: if( IS_EVIL( ch ) && !is_safe( victim, ch, TRUE ) ) /* was IS_EVIL(ch) ||.... didn't make sense to me - FB */ multi_hit( victim, ch, TYPE_UNDEFINED ); else if( IS_NEUTRAL( ch ) ) { act( AT_ACTION, "$n slaps $N.", victim, NULL, ch, TO_NOTVICT ); act( AT_ACTION, "You slap $N.", victim, NULL, ch, TO_CHAR ); act( AT_ACTION, "$n slaps you.", victim, NULL, ch, TO_VICT ); } else { act( AT_ACTION, "$n acts like $N doesn't even exist.", victim, NULL, ch, TO_NOTVICT ); act( AT_ACTION, "You just ignore $N.", victim, NULL, ch, TO_CHAR ); act( AT_ACTION, "$n appears to be ignoring you.", victim, NULL, ch, TO_VICT ); } break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: act( AT_SOCIAL, social->others_found, victim, NULL, ch, TO_NOTVICT ); act( AT_SOCIAL, social->char_found, victim, NULL, ch, TO_CHAR ); act( AT_SOCIAL, social->vict_found, victim, NULL, ch, TO_VICT ); break; case 9: case 10: case 11: case 12: act( AT_ACTION, "$n slaps $N.", victim, NULL, ch, TO_NOTVICT ); act( AT_ACTION, "You slap $N.", victim, NULL, ch, TO_CHAR ); act( AT_ACTION, "$n slaps you.", victim, NULL, ch, TO_VICT ); break; } } } /* * Replace the chars in the ignoring list to the room * note that the ordering of the players in the room * might change */ if( i != 0 ) { for( k = 0, victim = removed[0]; k < i; k++, victim = removed[k] ) { LINK( victim, room->first_person, room->last_person, next_in_room, prev_in_room ); } } return TRUE; }
char *get_exits( CHAR_DATA * ch ) { static char buf[MAX_STRING_LENGTH]; EXIT_DATA *pexit; bool found = FALSE; buf[0] = '\0'; if ( !check_blind( ch ) ) return buf; set_char_color( AT_EXITS, ch ); mudstrlcpy( buf, "[Exits:", MAX_STRING_LENGTH ); for ( pexit = ch->in_room->first_exit; pexit; pexit = pexit->next ) { if ( IS_IMMORTAL( ch ) ) /* * Immortals see all exits, even secret ones */ { if ( pexit->to_room ) { found = TRUE; mudstrlcat( buf, " ", MAX_STRING_LENGTH ); mudstrlcat( buf, capitalize( dir_name[pexit->vdir] ), MAX_STRING_LENGTH ); /* * New code added to display closed, or otherwise invisible exits to immortals * Installed by Samson 1-25-98 */ if ( IS_SET( pexit->exit_info, EX_CLOSED ) ) mudstrlcat( buf, "->(Closed)", MAX_STRING_LENGTH ); if ( IS_SET( pexit->exit_info, EX_DIG ) ) mudstrlcat( buf, "->(Dig)", MAX_STRING_LENGTH ); if ( IS_SET( pexit->exit_info, EX_WINDOW ) ) mudstrlcat( buf, "->(Window)", MAX_STRING_LENGTH ); if ( IS_SET( pexit->exit_info, EX_HIDDEN ) ) mudstrlcat( buf, "->(Hidden)", MAX_STRING_LENGTH ); if ( xIS_SET( pexit->to_room->room_flags, ROOM_DEATH ) ) mudstrlcat( buf, "->(Deathtrap)", MAX_STRING_LENGTH ); } } else { if ( pexit->to_room && !IS_SET( pexit->exit_info, EX_SECRET ) && ( !IS_SET( pexit->exit_info, EX_WINDOW ) || IS_SET( pexit->exit_info, EX_ISDOOR ) ) && !IS_SET( pexit->exit_info, EX_HIDDEN ) ) { found = TRUE; mudstrlcat( buf, " ", MAX_STRING_LENGTH ); mudstrlcat( buf, capitalize( dir_name[pexit->vdir] ), MAX_STRING_LENGTH ); if ( IS_SET( pexit->exit_info, EX_CLOSED ) ) mudstrlcat( buf, "->(Closed)", MAX_STRING_LENGTH ); if ( IS_AFFECTED( ch, AFF_DETECTTRAPS ) && xIS_SET( pexit->to_room->room_flags, ROOM_DEATH ) ) mudstrlcat( buf, "->(Deathtrap)", MAX_STRING_LENGTH ); } } } if ( !found ) mudstrlcat( buf, " none]", MAX_STRING_LENGTH ); else mudstrlcat( buf, "]", MAX_STRING_LENGTH ); mudstrlcat( buf, "\r\n", MAX_STRING_LENGTH ); return buf; }
void do_hintedit( CHAR_DATA* ch, const char* argument) { char arg[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char arg3[MAX_STRING_LENGTH]; HINT_DATA *hintData; int i; int no = 0; int ano = 0; bool found = FALSE; if( IS_NPC( ch ) ) return; if( !IS_IMMORTAL( ch ) ) return; set_char_color( AT_LBLUE, ch ); argument = one_argument( argument, arg ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if( !str_cmp( arg, "help" ) || arg[0] == '\0' ) { do_help( ch, "imm_hints" ); return; } if( !str_cmp( arg, "list" ) ) { if( first_hint ) { pager_printf( ch, "No | Low | High | Text \r\n" ); pager_printf( ch, "---|-----|------|--------------------------------------------------\r\n" ); i = 0; for( hintData = first_hint; hintData; hintData = hintData->next ) { ++i; pager_printf( ch, "%2d | %3d | %4d | %-30s\r\n", i, hintData->low, hintData->high, hintData->text ); } pager_printf( ch, "\r\n%d hints in file.\r\n", i ); } else send_to_char( "No hints in file.\r\n", ch ); return; } else if( !str_cmp( arg, "remove" ) ) { no = 0; if( !is_number( arg2 ) ) { send_to_char_color( "Remove which hint?\r\n", ch ); return; } ano = atoi( arg2 ); found = FALSE; for( hintData = first_hint; hintData; hintData = hintData->next ) { ++no; if( no == ano ) { ch_printf_color( ch, "&CHint Number %d removed\r\n", ano ); UNLINK( hintData, first_hint, last_hint, next, prev ); STRFREE( hintData->text ); DISPOSE( hintData ); found = TRUE; break; } } if( !found ) { send_to_char( "Hint not found\r\n", ch ); return; } return; } else if( !str_cmp( arg, "add" ) ) { if( arg2 == '\0' ) { send_to_char( "What is the minimum level for this hint?\r\n", ch ); return; } if( arg3 == '\0' ) { send_to_char( "What is the maximum level for this hint?\r\n", ch ); return; } if( atoi( arg2 ) > atoi( arg3 ) ) { send_to_char( "Aborting: max less than min!\r\n", ch ); return; } CREATE( hintData, HINT_DATA, 1 ); hintData->low = atoi( arg2 ); hintData->high = atoi( arg3 ); hintData->text = STRALLOC( argument ); LINK( hintData, first_hint, last_hint, next, prev ); send_to_char( "Ok. Hint created\r\n", ch ); return; } else if( !str_cmp( arg, "force" ) ) { ch_printf_color( ch, "&p( &wHINT&p ): &P%s\r\n", get_hint( LEVEL_AVATAR ) ); return; } else if( !str_cmp( arg, "edit" ) ) { no = 0; i = 0; if( arg2[0] == '\0' ) { send_to_char( "Edit which hint number?\r\n", ch ); return; } else no = atoi( arg2 ); if( arg3[0] == '\0' ) { ch_printf( ch, "Edit which field of hint %d (low/high/text)?\r\n", no ); return; } if( argument[0] == '\0' ) { ch_printf( ch, "Change hint %d's field %s to what ?\r\n", no, arg3 ); return; } for( hintData = first_hint; hintData; hintData = hintData->next ) { ++i; if( i == no ) { found = TRUE; break; } } if( !found ) { ch_printf( ch, "Hint %d not found.\r\n", no ); return; } else { if( !str_cmp( arg3, "text" ) ) { STRFREE( hintData->text ); hintData->text = STRALLOC( argument ); send_to_char( "Hint text changed!\r\n", ch ); return; } else if( !str_cmp( arg3, "low" ) ) { if( atoi( argument ) > hintData->high ) { send_to_char( "Aborting: min higher than max.\r\n", ch ); return; } hintData->low = atoi( argument ); send_to_char( "Minimum level for hint changed.\r\n", ch ); return; } else if( !str_cmp( arg3, "high" ) ) { if( atoi( argument ) < hintData->low ) { send_to_char( "Aborting: max lower than min.\r\n", ch ); return; } hintData->high = atoi( argument ); send_to_char( "Maximum level for hint changed.\r\n", ch ); return; } else { send_to_char( "Valid fields are: low/high/text\r\n", ch ); return; } } } else if( !str_cmp( arg, "save" ) ) { write_hint( ); send_to_char( "Saved.\r\n", ch ); return; } else { send_to_char( "Syntax: hint (list/add/remove/edit/save/force)\r\n", ch ); return; } }
/* * New score command by Haus */ void do_score( CHAR_DATA * ch, const char *argument ) { AFFECT_DATA *paf; int iLang, x; if( IS_NPC( ch ) ) { do_oldscore( ch, argument ); return; } ch_printf( ch, "\r\n&zScore for %s.\r\n", ch->pcdata->title ); if( get_trust( ch ) != ch->top_level ) ch_printf( ch, "You are trusted at level %d.\r\n", get_trust( ch ) ); send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch ); ch_printf( ch, "&r|&zRace &r:&W %-3d&z year old %-10.10s Log In&r:&W %-25.24s&r|\r\n", get_age( ch ), capitalize( get_race( ch ) ), ctime( &( ch->logon ) ) ); ch_printf( ch, "&r|&zHitroll &r: &W%-5d &zDamroll&r:&W %-5d &zSaved &r:&W %-25.24s&r|\r\n", GET_HITROLL( ch ), GET_DAMROLL( ch ), ch->save_time ? ctime( &( ch->save_time ) ) : "no" ); ch_printf( ch, "&r|&zGlobal AC &r: &W%-5d &zEvasion&r: &W%-5d &zTime &r: &W%-25.24s&r|\r\n", GET_ARMOR( ch ), GET_EVASION( ch ), ctime( ¤t_time ) ); ch_printf( ch, "&r|&zAlign &r: &W%-5d &zWimpy &r:&W %-3d &r|\r\n", ch->alignment, ch->wimpy ); send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch ); send_to_char( " &zBarehand Damtypes&r:", ch ); for( x = 0; x < MAX_DAMTYPE; x++ ) if( xIS_SET( ch->damtype, x ) ) ch_printf( ch, " &W%s&r,", d_type[x] ); send_to_char( "\r\n", ch ); ch_printf( ch, " &r&zHit Points&r: &W%d&z of&W %d &z Move&r: &W%d&z of&W %d &z Force&r:&W %d&z of&W %d&z\r\n", ch->hit, ch->max_hit, ch->move, ch->max_move, ch->mana, ch->max_mana ); ch_printf( ch, " &zStr&r: &W%2d &zDex&r:&W %2d &zCon&r: &W%2d &zAgi&r:&W %2d &z Int&r:&W %2d &zWis&r:&W %2d&z Cha&r: &w%2d&z\r\n", get_curr_str( ch ), get_curr_dex( ch ), get_curr_con( ch ), get_curr_agi( ch ), get_curr_int( ch ), get_curr_wis( ch ), get_curr_cha( ch ) ); send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch ); { int ability; for( ability = 0; ability < MAX_ABILITY; ability++ ) { if( ch->skill_level[ability] < 1 ) continue; ch_printf( ch, " &W%-15s &zLevel&r: &W%-3d &zMax&r: &W%-3d &zExp&r: &W%-10ld &zNext&r: &W%-10ld&z\r\n", ability_name[ability], ch->skill_level[ability], max_level( ch, ability ), ch->experience[ability], exp_level( ch->skill_level[ability] + 1 ) ); if( ability == COMBAT_ABILITY ) { for( x = 0; x < MAX_DISCIPLINE; x++ ) if( ch->known_disciplines[x] != NULL ) ch_printf( ch, " - %s%s&g\r\n", is_discipline_set( ch, ch->known_disciplines[x] ) ? "&z" : "&W", ch->known_disciplines[x]->name ); } } } send_to_char( "&r----------------------------------------------------------------------------\r\n", ch ); send_to_char( "&r|&zDamage &zType &r| &zPenetrate &r| &zResist &r| &zPotency &r|\r\n", ch ); send_to_char( "&r----------------------------------------------------------------------------\r\n", ch ); for( x = 0; x < MAX_DAMTYPE; x++ ) ch_printf( ch, "&r|%-19.19s&r: &W%3d &r| &W%3d &r| &W%3d &r|\r\n", d_type_score[x], ch->penetration[x], ch->resistance[x], ch->damtype_potency[x] ); send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch ); ch_printf( ch, "&zCREDITS&r:&W %-10d &zBANK&r: &W%-10d &zPkills&r: &W%-5.5d &zMkills&r:&W %-5.5d\r\n", ch->gold, ch->pcdata->bank, ch->pcdata->pkills, ch->pcdata->mkills ); ch_printf( ch, "&zWeight&r: &W%5.5d &r(&zmax&W %7.7d&r)&z Items&r: &W%5.5d &r(&zmax&W %5.5d&r)\r\n", ch->carry_weight, can_carry_w( ch ), ch->carry_number, can_carry_n( ch ) ); ch_printf( ch, "&zPager&r: &r(&W%c&r)&W %3d &z AutoExit&r(&W%c&r) &z AutoLoot&r(&W%c&r)&z Autosac&r(&W%c&r)\r\n", IS_SET( ch->pcdata->flags, PCFLAG_PAGERON ) ? 'X' : ' ', ch->pcdata->pagerlen, IS_SET( ch->act, PLR_AUTOEXIT ) ? 'X' : ' ', IS_SET( ch->act, PLR_AUTOLOOT ) ? 'X' : ' ', IS_SET( ch->act, PLR_AUTOSAC ) ? 'X' : ' ' ); send_to_char( "\r\n&zLanguages&r: ", ch ); for( iLang = 0; lang_array[iLang] != LANG_UNKNOWN; iLang++ ) if( knows_language( ch, lang_array[iLang], ch ) || ( IS_NPC( ch ) && ch->speaks == 0 ) ) { if( lang_array[iLang] & ch->speaking || ( IS_NPC( ch ) && !ch->speaking ) ) set_char_color( AT_RED, ch ); send_to_char( lang_names[iLang], ch ); send_to_char( " ", ch ); set_char_color( AT_SCORE, ch ); } send_to_char( "\r\n", ch ); ch_printf( ch, "&zWANTED ON&r: &W%s\r\n", flag_string( ch->pcdata->wanted_flags, planet_flags ) ); if( ch->pcdata->bestowments && ch->pcdata->bestowments[0] != '\0' ) ch_printf( ch, "&zYou are bestowed with the command&r(&zs&r):&W %s.\r\n", ch->pcdata->bestowments ); if( ch->pcdata->clan ) { send_to_char( "&r----------------------------------------------------------------------------\r\n", ch ); ch_printf( ch, "&zORGANIZATION&r:&W %-35s &zPkills&r/&zDeaths&r: &W%3.3d&r/&W%3.3d", ch->pcdata->clan->name, ch->pcdata->clan->pkills, ch->pcdata->clan->pdeaths ); send_to_char( "\r\n", ch ); } if( IS_IMMORTAL( ch ) ) { send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch ); ch_printf( ch, "IMMORTAL DATA: Wizinvis [%s] Wizlevel (%d)\r\n", IS_SET( ch->act, PLR_WIZINVIS ) ? "X" : " ", ch->pcdata->wizinvis ); ch_printf( ch, "Bamfin: %s\r\n", ( ch->pcdata->bamfin[0] != '\0' ) ? ch->pcdata->bamfin : "%s appears in a swirling mist.", ch->name ); ch_printf( ch, "Bamfout: %s\r\n", ( ch->pcdata->bamfout[0] != '\0' ) ? ch->pcdata->bamfout : "%s leaves in a swirling mist.", ch->name ); /* * Area Loaded info - Scryn 8/11 */ if( ch->pcdata->area ) { ch_printf( ch, "Vnums: Room (%-5.5d - %-5.5d) Object (%-5.5d - %-5.5d) Mob (%-5.5d - %-5.5d)\r\n", ch->pcdata->area->low_r_vnum, ch->pcdata->area->hi_r_vnum, ch->pcdata->area->low_o_vnum, ch->pcdata->area->hi_o_vnum, ch->pcdata->area->low_m_vnum, ch->pcdata->area->hi_m_vnum ); ch_printf( ch, "Area Loaded [%s]\r\n", ( IS_SET( ch->pcdata->area->status, AREA_LOADED ) ) ? "yes" : "no" ); } } if( ch->first_affect ) { int i; const char *skname; i = 0; send_to_char( "&r----------------------------------------------------------------------------&z\r\n", ch ); send_to_char( "&zAFFECT DATA&r:\r\n", ch ); for( paf = ch->first_affect; paf; paf = paf->next ) { skname = paf->from; if( paf->modifier == 0 ) ch_printf( ch, "&r[&W%-63.64s&r;&W%5d &zrds&r]", skname, (int)paf->duration ); else if( paf->modifier > 999 ) ch_printf( ch, "&r[&W%-54.55s&r; &W%7.7s&r;&W%5d &zrds&r]", skname, tiny_affect_loc_name( paf->location ), (int)paf->duration ); else ch_printf( ch, "&r[&W%-51.52s&r;&W%+-3.3d %7.7s&r;%5d &zrds&r]", skname, paf->modifier, tiny_affect_loc_name( paf->location ), (int)paf->duration ); if( i == 0 ) i = 1; if( ( ++i % 1 ) == 0 ) send_to_char( "\r\n", ch ); } } send_to_char( "\r\n&w", 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; }
/* olc editnews command */ void do_editnews( CHAR_DATA* ch, const char* argument) { char arg[MAX_INPUT_LENGTH]; if( IS_NPC( ch ) || !IS_IMMORTAL( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } set_char_color( AT_GREEN, ch ); switch ( ch->substate ) { default: break; case SUB_NEWS_POST: { NEWS *news = NULL; news = ( NEWS * ) ch->dest_buf; STRFREE( news->post ); news->post = copy_buffer( ch ); stop_editing( ch ); ch->substate = ch->tempnum; renumber_news( ); save_news( ); return; } break; case SUB_NEWS_EDIT: { NEWS *news = NULL; news = ( NEWS * ) ch->dest_buf; STRFREE( news->post ); news->post = copy_buffer( ch ); stop_editing( ch ); ch->substate = ch->tempnum; renumber_news( ); save_news( ); return; } break; } argument = one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char( "Syntax: editnews addtype <name>\r\n" " editnews addnews <type> <subject>\r\n" " editnews removetype <number>\r\n" " editnews removenews <type> <number>\r\n" " editnews edittype <field> <value>\r\n" " editnews editnews <type> <number> <new subject [optional]>\r\n" " Fields being one of the following:\r\n" " name header cmd_name level\r\n", ch ); return; } if( !str_cmp( arg, "save" ) ) { renumber_news( ); save_news( ); send_to_char( "News saved.\r\n", ch ); return; } if( !str_cmp( arg, "addtype" ) ) { NEWS_TYPE *type = NULL; if( argument[0] == '\0' ) { send_to_char( "Syntax: editnews addtype <name>\r\n", ch ); return; } if( top_news_type >= NEWS_MAX_TYPES ) { send_to_char( "There are too many news types.\r\n", ch ); return; } CREATE( type, NEWS_TYPE, 1 ); type->name = STRALLOC( argument ); type->cmd_name = STRALLOC( argument ); type->vnum = top_news_type++; type->level = -1; news_command_table[type->vnum] = STRALLOC( type->cmd_name ); LINK( type, first_news_type, last_news_type, next, prev ); ch_printf( ch, "Newstype '%s' created.\r\n", argument ); return; } if( !str_cmp( arg, "removetype" ) ) { NEWS_TYPE *type = NULL; NEWS *news = NULL, *news_next; if( argument[0] == '\0' ) { send_to_char( "Syntax: editnews removetype <name>\r\n", ch ); return; } if( ( type = figure_type( argument ) ) == NULL ) { send_to_char( "Invaild newstype.\r\n", ch ); return; } UNLINK( type, first_news_type, last_news_type, next, prev ); STRFREE( type->name ); STRFREE( type->header ); STRFREE( type->cmd_name ); STRFREE( news_command_table[type->vnum] ); STRFREE( news_command_table[type->level] ); for( news = type->first_news; news; news = news_next ) { news_next = news->next; UNLINK( news, type->first_news, type->last_news, next, prev ); STRFREE( news->name ); STRFREE( news->title ); STRFREE( news->date ); STRFREE( news->post ); DISPOSE( news ); } DISPOSE( type ); --top_news_type; renumber_news( ); save_news( ); ch_printf( ch, "Newstype '%s' removed.\r\n", argument ); return; } if( !str_cmp( arg, "edittype" ) ) { char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; NEWS_TYPE *type = NULL; argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if( arg2[0] == '\0' || arg3[0] == '\0' ) { send_to_char( "Syntax: editnews edittype <type> <field> <value>\r\n", ch ); send_to_char( "Fields being one of the following:\r\n" "name header cmd_name level\r\n", ch ); return; } if( ( type = figure_type( arg2 ) ) == NULL ) { send_to_char( "Invalid newstype.\r\n", ch ); return; } if( !str_cmp( arg3, "cmd_name" ) ) { type->cmd_name = STRALLOC( argument ); news_command_table[type->vnum] = STRALLOC( type->cmd_name ); send_to_char( "Cmd_name set.\r\n", ch ); save_news( ); return; } else if( !str_cmp( arg3, "name" ) ) { type->name = STRALLOC( argument ); send_to_char( "Name set.\r\n", ch ); save_news( ); return; } else if( !str_cmp( arg3, "level" ) ) { if( argument[0] == '\0' ) { ch_printf( ch, "%d\r\n", type->level ); return; } else type->level = atoi( argument ); send_to_char( "Level set.\r\n", ch ); save_news( ); return; } else { send_to_char( "Syntax: editnews edittype <type> <field> <value>\r\n", ch ); send_to_char( "Fields being one of the following:\r\n" "name header cmd_name level\r\n", ch ); return; } } if( !str_cmp( arg, "addnews" ) ) { char arg2[MAX_INPUT_LENGTH]; NEWS_TYPE *type = NULL; NEWS *news = NULL; argument = one_argument( argument, arg2 ); if( arg2[0] == '\0' || argument[0] == '\0' ) { send_to_char( "Syntax: editnews addnews <type> <subject>\r\n", ch ); return; } if( ( type = figure_type( arg2 ) ) == NULL ) { send_to_char( "Invaild newstype. Use 'newstypes' to get a valid listing.\r\n", ch ); return; } CREATE( news, NEWS, 1 ); news->title = STRALLOC( argument ); news->name = STRALLOC( ch->name ); news->date = STRALLOC( stamp_time( ) ); news->post = STRALLOC( "" ); /* * pop character into a writing buffer */ if( ch->substate == SUB_REPEATCMD ) ch->tempnum = SUB_REPEATCMD; else ch->tempnum = SUB_NONE; ch->substate = SUB_NEWS_POST; ch->dest_buf = news; start_editing( ch, news->post ); LINK( news, type->first_news, type->last_news, next, prev ); return; } if( !str_cmp( arg, "editnews" ) ) { char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; NEWS *news = NULL; NEWS_TYPE *type = NULL; argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); if( arg2[0] == '\0' ) { send_to_char( "Syntax: editnews editnews <type> <number> <new subject [optional]>\r\n", ch ); return; } /* * changed for new -newstype- indexing - 5/5/02 */ if( ( type = figure_type( arg2 ) ) == NULL ) { send_to_char( "Invalid newstype. Use 'newstypes' to get a valid listing.\r\n", ch ); return; } if( ( news = grab_news( type, arg3 ) ) == NULL ) { pager_printf_color( ch, "That's not a valid news number.\r\nUse '%s' to view the valid numbers.\r\n", type->cmd_name ); return; } /* * a changed title */ if( argument[0] != '\0' ) news->title = STRALLOC( argument ); /* * new date news was edited */ news->date = STRALLOC( stamp_time( ) ); /* * pop character into a writing buffer */ if( ch->substate == SUB_REPEATCMD ) ch->tempnum = SUB_REPEATCMD; else ch->tempnum = SUB_NONE; ch->substate = SUB_NEWS_EDIT; ch->dest_buf = news; start_editing( ch, news->post ); return; } if( !str_cmp( arg, "removenews" ) ) { char arg2[MAX_INPUT_LENGTH]; NEWS *news = NULL; NEWS_TYPE *type = NULL; argument = one_argument( argument, arg2 ); if( argument[0] == '\0' || arg2[0] == '\0' ) { send_to_char( "Syntax: editnews remove <number>\r\n", ch ); return; } /* * changed for new -newstype- indexing - 5/5/02 */ if( ( type = figure_type( arg2 ) ) == NULL ) { send_to_char( "Invalid newstype. Use 'newstypes' to get a valid listing.\r\n", ch ); return; } if( ( news = grab_news( type, argument ) ) == NULL ) { send_to_char( "Type 'news' to gain a list of the news numbers.\r\n", ch ); return; } UNLINK( news, type->first_news, type->last_news, next, prev ); STRFREE( news->name ); STRFREE( news->title ); STRFREE( news->date ); STRFREE( news->post ); DISPOSE( news ); renumber_news( ); save_news( ); send_to_char( "News item removed.\r\n", ch ); return; } }
void do_affected( CHAR_DATA * ch, const char *argument ) { char arg[MAX_INPUT_LENGTH]; AFFECT_DATA *paf; SKILLTYPE *skill; int x; if( IS_NPC( ch ) ) return; argument = one_argument( argument, arg ); if( !str_cmp( arg, "by" ) ) { set_char_color( AT_BLUE, ch ); send_to_char( "\r\nImbued with:\r\n", ch ); set_char_color( AT_SCORE, ch ); ch_printf( ch, "%s\r\n", affect_bit_name( &ch->affected_by ) ); if( ch->top_level >= 20 ) { send_to_char( "\r\n", ch ); if( ch->resistant > 0 ) { set_char_color( AT_BLUE, ch ); send_to_char( "Resistances: ", ch ); set_char_color( AT_SCORE, ch ); ch_printf( ch, "%s\r\n", flag_string( ch->resistant, ris_flags ) ); } if( ch->immune > 0 ) { set_char_color( AT_BLUE, ch ); send_to_char( "Immunities: ", ch ); set_char_color( AT_SCORE, ch ); ch_printf( ch, "%s\r\n", flag_string( ch->immune, ris_flags ) ); } if( ch->susceptible > 0 ) { set_char_color( AT_BLUE, ch ); send_to_char( "Suscepts: ", ch ); set_char_color( AT_SCORE, ch ); ch_printf( ch, "%s\r\n", flag_string( ch->susceptible, ris_flags ) ); } } return; } if( !ch->first_affect && xIS_EMPTY( ch->affected_by ) ) { set_char_color( AT_SCORE, ch ); send_to_char( "\r\nNo cantrip or skill affects you.\r\n", ch ); } else { send_to_char( "\r\n", ch ); for( paf = ch->first_affect; paf; paf = paf->next ) if( ( skill = get_skilltype( paf->type ) ) != NULL ) { set_char_color( AT_BLUE, ch ); send_to_char( "Affected: ", ch ); set_char_color( AT_SCORE, ch ); if( ch->top_level >= 20 ) { if( paf->duration < 25 ) set_char_color( AT_WHITE, ch ); if( paf->duration < 6 ) set_char_color( AT_WHITE + AT_BLINK, ch ); ch_printf( ch, "(%5d) ", paf->duration ); } ch_printf( ch, "%-18s\r\n", skill->name ); } send_to_char( "\r\nAFF_Flags:", ch ); for( x = 0; x < MAX_AFF; x++ ) if( xIS_SET( ch->affected_by, x ) ) ch_printf( ch, " %s,", a_flags[x] ); send_to_char( "\r\n", ch ); } return; }
void do_equipment( CHAR_DATA * ch, const char *argument ) { OBJ_DATA *obj; int iWear, dam; bool found; char buf[MAX_STRING_LENGTH]; set_char_color( AT_RED, ch ); send_to_char( "You are using:\r\n", ch ); found = FALSE; set_char_color( AT_OBJECT, ch ); for( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for( obj = ch->first_carrying; obj; obj = obj->next_content ) if( obj->wear_loc == iWear ) { send_to_char( where_name[iWear], ch ); if( can_see_obj( ch, obj ) ) { send_to_char( format_obj_to_char( obj, ch, TRUE ), ch ); strcpy( buf, "" ); switch ( obj->item_type ) { default: break; case ITEM_BACTA: ch_printf( ch, " %d", obj->value[0] ); break; case ITEM_ARMOR: if( obj->value[1] == 0 ) obj->value[1] = obj->value[0]; if( obj->value[1] == 0 ) obj->value[1] = 1; dam = ( short )( ( obj->value[0] * 10 ) / obj->value[1] ); if( dam >= 10 ) strcat( buf, " (superb) " ); else if( dam >= 7 ) strcat( buf, " (good) " ); else if( dam >= 5 ) strcat( buf, " (worn) " ); else if( dam >= 3 ) strcat( buf, " (poor) " ); else if( dam >= 1 ) strcat( buf, " (awful) " ); else if( dam == 0 ) strcat( buf, " (broken) " ); send_to_char( buf, ch ); break; case ITEM_WEAPON: dam = INIT_WEAPON_CONDITION - obj->value[0]; if( dam < 2 ) strcat( buf, " (superb) " ); else if( dam < 4 ) strcat( buf, " (good) " ); else if( dam < 7 ) strcat( buf, " (worn) " ); else if( dam < 10 ) strcat( buf, " (poor) " ); else if( dam < 12 ) strcat( buf, " (awful) " ); else if( dam == 12 ) strcat( buf, " (broken) " ); send_to_char( buf, ch ); if( obj->value[3] == WEAPON_BLASTER ) { if( obj->blaster_setting == BLASTER_FULL ) ch_printf( ch, "FULL" ); else if( obj->blaster_setting == BLASTER_HIGH ) ch_printf( ch, "HIGH" ); else if( obj->blaster_setting == BLASTER_NORMAL ) ch_printf( ch, "NORMAL" ); else if( obj->blaster_setting == BLASTER_HALF ) ch_printf( ch, "HALF" ); else if( obj->blaster_setting == BLASTER_LOW ) ch_printf( ch, "LOW" ); else if( obj->blaster_setting == BLASTER_STUN ) ch_printf( ch, "STUN" ); ch_printf( ch, " %d", obj->value[4] ); } else if( ( obj->value[3] == WEAPON_LIGHTSABER || obj->value[3] == WEAPON_VIBRO_BLADE || obj->value[3] == WEAPON_FORCE_PIKE || obj->value[3] == WEAPON_BOWCASTER ) ) { ch_printf( ch, "%d", obj->value[4] ); } break; } send_to_char( "\r\n", ch ); } else send_to_char( "something.\r\n", ch ); found = TRUE; } } if( !found ) send_to_char( "Nothing.\r\n", ch ); return; }
void do_mapout( CHAR_DATA* ch, const char* argument) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *map_obj; /* an obj made with map as an ed */ OBJ_INDEX_DATA *map_obj_index; /* obj_index for previous */ EXTRA_DESCR_DATA *ed; /* the ed for it to go in */ int rooms, rows, cols, avail_rooms; if( !ch ) { bug( "%s", "do_mapout: null ch" ); return; } if( IS_NPC( ch ) ) { send_to_char( "Not in mobs.\r\n", ch ); return; } if( !ch->desc ) { bug( "%s", "do_mapout: no descriptor" ); return; } switch ( ch->substate ) { default: break; case SUB_WRITING_NOTE: if( ch->dest_buf != ch->pnote ) bug( "%s", "do_mapout: sub_writing_map: ch->dest_buf != ch->pnote" ); 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, "stat" ) ) { if( !ch->pnote ) { send_to_char( "You have no map in progress.\r\n", ch ); return; } map_stats( ch, &rooms, &rows, &cols ); ch_printf( ch, "Map represents %d rooms, %d rows, and %d columns\r\n", rooms, rows, cols ); avail_rooms = num_rooms_avail( ch ); ch_printf( ch, "You currently have %d unused rooms.\r\n", avail_rooms ); act( AT_ACTION, "$n glances at an etherial map.", ch, NULL, NULL, TO_ROOM ); 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, "clear" ) ) { if( !ch->pnote ) { send_to_char( "You have no map in progress\r\n", ch ); return; } 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( "Map cleared.\r\n", ch ); return; } if( !str_cmp( arg, "show" ) ) { if( !ch->pnote ) { send_to_char( "You have no map in progress.\r\n", ch ); return; } send_to_char( ch->pnote->text, ch ); do_mapout( ch, "stat" ); return; } if( !str_cmp( arg, "create" ) ) { if( !ch->pnote ) { send_to_char( "You have no map in progress.\r\n", ch ); return; } map_stats( ch, &rooms, &rows, &cols ); avail_rooms = num_rooms_avail( ch ); /* * check for not enough rooms */ if( rooms > avail_rooms ) { send_to_char( "You don't have enough unused rooms allocated!\r\n", ch ); return; } act( AT_ACTION, "$n warps the very dimensions of space!", ch, NULL, NULL, TO_ROOM ); map_to_rooms( ch, NULL ); /* this does the grunt work */ map_obj_index = get_obj_index( 91 ); if( map_obj_index ) { map_obj = create_object( map_obj_index, 0 ); ed = SetOExtra( map_obj, "runes map scrawls" ); STRFREE( ed->description ); ed->description = QUICKLINK( ch->pnote->text ); obj_to_char( map_obj, ch ); } else { send_to_char( "Couldn't give you a map object. Need Great Eastern Desert\r\n", ch ); return; } do_mapout( ch, "clear" ); send_to_char( "Ok.\r\n", ch ); return; } send_to_char( "mapout write: create a map in edit buffer.\r\n", ch ); send_to_char( "mapout stat: get information about a written, but not yet created map.\r\n", ch ); send_to_char( "mapout clear: clear a written, but not yet created map.\r\n", ch ); send_to_char( "mapout show: show a written, but not yet created map.\r\n", ch ); send_to_char( "mapout create: turn a written map into rooms in your assigned room vnum range.\r\n", ch ); return; }
void do_journal( CHAR_DATA *ch, char *argument ) { QUEST_DATA *quest; CHQUEST_DATA *chquest; CHAP_DATA *chap; char arg1[MIL], arg2[MIL]; char *chapdesc; int x = 0, total = 0, cando = 0, done = 0, num = 0, progress = 0, avail = 0; bool found = FALSE, completed = FALSE; set_char_color( AT_PLAIN, ch ); if ( IS_NPC( ch ) ) { error( ch ); return; } argument = one_argument( argument, arg1 ); if ( VLD_STR( arg1 ) && !str_cmp( arg1, "completados" ) ) { completed = TRUE; argument = one_argument( argument, arg1 ); } argument = one_argument( argument, arg2 ); if ( !arg1 || arg1[0] == '\0' ) { char questtime[MSL] = ""; char chaptime[MSL] = ""; char minsecs[MSL] = ""; int time = 0, mins = 0, secs = 0; ch_printf( ch, "\r\n&YQUESTS De %s&D\r\n\r\n", ch->name ); send_to_char( "&cNIV Quest Capítulo Progreso&D\r\n", ch ); for ( quest = first_quest; quest; quest = quest->next ) { num = quest->number; total++; if ( ch->level < quest->level ) continue; cando++; for ( chquest = ch->pcdata->first_quest; chquest; chquest = chquest->next ) { if ( chquest->questnum == quest->number ) { progress = chquest->progress; break; } } if ( !progress || !chquest ) continue; chap = get_chap_from_quest( progress, quest ); if ( !completed ) { if ( progress > quest->chapters ) { done++; continue; } if ( !chap ) continue; if ( chap && chap->desc ) chapdesc = chap->desc; else chapdesc = ( char * ) "NULL: No desc for this chapter."; } else { /* Only show completed quest */ if ( progress > quest->chapters ) { chapdesc = ( char * ) "¡quest completado!"; done++; } else continue; } avail++; if ( ch->level == quest->level ) send_to_char( "&Y", ch ); else if ( quest->level >= ( ch->level - 3 ) ) send_to_char( "&G", ch ); else send_to_char( "&z", ch ); ch_printf( ch, "%3d %20s %7d %s", quest->level, capitalize( quest->name ), progress, chapdesc ); if ( chquest->kamount > 0 ) ch_printf( ch, "&R(%d)&D", chquest->kamount ); send_to_char( "\r\n", ch ); if ( chquest->chaplimit > 0 ) ch_printf( ch, "Te queda %s para completar el capítulo.\r\n", show_timeleft( chquest->chaplimit ) ); if ( chquest->questlimit > 0 ) ch_printf( ch, "Te queda %s para finalizar el quest.\r\n", show_timeleft( chquest->questlimit ) ); } if ( avail == 0 && done == 0 ) send_to_char( "&B¡No has terminado ningún quest! ¡Ve a explorar!&D", ch ); send_to_char( "\r\n\r\n", ch ); if ( IS_IMMORTAL( ch ) ) ch_printf( ch, "&cquest disponibles: &C%d\r\n", total ); ch_printf( ch, "&cQuests encontrado: &C%d &cQuests Finalizados: &C%d&D\r\n", avail, done ); send_to_char( "\r\n&GMás información de un quest: &WDiario <nombre>&D\r\n", ch ); send_to_char( "\r\n&Gpara ver los quest completados: &Wdiario completados&D\r\n", ch ); return; } quest = get_quest_from_name( arg1 ); if ( !quest ) { send_to_char( "&Gsintaxis: diario \r\n diario <nombre del quest>&D\r\n", ch ); return; } for ( chquest = ch->pcdata->first_quest; chquest; chquest = chquest->next ) { if ( chquest->questnum != quest->number ) continue; send_to_char( "&GLeyendo la descripción del quest...\r\n", ch ); pager_printf( ch, "&W%s&D\r\n", quest->desc ? quest->desc : "(Not created!)" ); found = TRUE; break; } if ( !found ) send_to_char( "¡Este no es un quest de tu diario!\r\n", ch ); }
void do_setquest( CHAR_DATA *ch, char *argument ) { char arg1[MIL], arg2[MIL], arg3[MIL], arg4[MIL]; QUEST_DATA *quest; int x; set_char_color( AT_PLAIN, ch ); if ( IS_NPC( ch ) ) { error( ch ); return; } if ( !IS_IMMORTAL( ch ) ) { error( ch ); return; } if ( !ch->desc ) { bug( "%s", "do_setquest (desc): no descriptor" ); return; } switch ( ch->substate ) { default: break; case SUB_QUEST_DESC: if ( !ch->dest_buf || !( quest = ( QUEST_DATA * ) ch->dest_buf ) ) { bug( "%s: sub_quest_desc: NULL ch->dest_buf", __FUNCTION__ ); ch->substate = SUB_NONE; return; } ch->dest_buf = NULL; if ( VLD_STR( quest->desc ) ) STRFREE( quest->desc ); quest->desc = copy_buffer( ch ); stop_editing( ch ); write_quest_list( ); ch->substate = SUB_NONE; return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' ) { send_to_char( "&cUsage: setquest save all\r\n", ch ); send_to_char( " setquest <&Cqname&c> create\r\n", ch ); send_to_char( " setquest <&Cqname&c> delete\r\n", ch ); send_to_char( " setquest <&Cqname&c> chapter <#> delete\r\n", ch ); send_to_char( " setquest <&Cqname&c> desc\r\n", ch ); send_to_char( " setquest <&Cqname&c> <&Cfield&c>\r\n", ch ); send_to_char( " setquest <&Cquest&c> remove <&Cplayer&c>\r\n", ch ); send_to_char( " showquest <&Cqname&c>\r\n", ch ); send_to_char( " Field being one of:\r\n", ch ); send_to_char( "level svnum stype chapters chapter timelimit skipchapters glory\r\n", ch ); send_to_char( "\r\nchapter <n> <field2>\r\n", ch ); send_to_char( " Field2 being one of:\r\n", ch ); send_to_char( "create delete svnum stype\r\n", ch ); send_to_char( "name timelimit level kamount\r\n", ch ); send_to_char( "Note: 3600 = 1 hour timelimit\r\n", ch ); return; } if ( ( !str_cmp( arg1, "tutorial" ) && ch->level < 108 ) || ( !str_cmp( arg1, "etutorial" ) && ch->level < 108 ) || ( !str_cmp( arg1, "dtutorial" ) && ch->level < 108 ) ) { send_to_char( "You need Vladaar's permission to change anything with tutorials.\r\n", ch ); return; } if ( !str_cmp( arg1, "save" ) ) { if ( !str_cmp( arg2, "all" ) ) { write_quest_list( ); send_to_char( "All quests saved.\r\n", ch ); return; } } quest = get_quest_from_name( arg1 ); if ( !str_cmp( arg2, "create" ) ) { if ( quest && VLD_STR( quest->name ) && !str_cmp( quest->name, arg1 ) ) { ch_printf( ch, "(%s): quest already exists!\r\n", quest->name ); return; } CREATE( quest, QUEST_DATA, 1 ); quest->name = STRALLOC( arg1 ); quest->number = -1; add_new_quest( ch, quest ); write_quest_list( ); return; } if ( !quest ) { send_to_char( "No quest by that name.\r\n", ch ); return; } if ( !str_cmp( arg2, "desc" ) ) { if ( !ch->desc ) { bug( "%s", "do_setquest (desc): no descriptor" ); return; } ch->substate = SUB_QUEST_DESC; ch->dest_buf = quest; start_editing( ch, quest->desc ); return; } if ( !str_cmp( arg2, "delete" ) ) { free_quest( quest ); send_to_char( "Deleted.\r\n", ch ); return; } if ( !str_cmp( arg2, "skipchapters" ) ) { quest->skipchapters = !quest->skipchapters; ch_printf( ch, "That quest will %s allow chapters to be skipped.\r\n", quest->skipchapters ? "now" : "no longer" ); return; } if ( !str_cmp( arg2, "chapters" ) ) { x = atoi( argument ); if ( x < 0 || x > 30 ) { send_to_char( "Chapters must be between 0 and 30.\r\n", ch ); return; } quest->chapters = x; send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "svnum" ) ) { quest->svnum = atoi( argument ); ch_printf( ch, "That quest's svnum (starting vnum) is set to %d.\r\n", quest->svnum ); return; } if ( !str_cmp( arg2, "stype" ) ) { x = atoi( argument ); if ( x < 0 || x > 2 ) { send_to_char ( "Can only set stype (starting type) to 0 for Mobiles, 1 for Objects, 2 for Rooms.\r\n", ch ); return; } quest->stype = x; ch_printf( ch, "That quest's stype (starting type) is set to %d[%s].\r\n", quest->stype, ( quest->stype == 0 ) ? "Mobile" : ( quest->stype == 1 ) ? "Object" : ( quest->stype == 2 ) ? "Room" : "Unknown" ); return; } if ( !str_cmp( arg2, "glory" ) ) { x = atoi( argument ); if ( x < 0 || x > 1 ) { send_to_char( "Can only set 0 for no glory, or 1 for glory.\r\n", ch ); return; } quest->glory = x; return; } if ( !str_cmp( arg2, "chapter" ) ) { CHAP_DATA *chap = NULL; argument = one_argument( argument, arg3 ); argument = one_argument( argument, arg4 ); int chapno = atoi( arg3 ); if ( chapno < 1 || chapno > MAX_CHAPTERS ) { ch_printf( ch, "Chapter range is 1 to %d.\r\n", MAX_CHAPTERS ); return; } if ( !str_cmp( arg4, "create" ) ) { if ( get_chap_from_quest( chapno, quest ) ) { send_to_char( "That chapter already exists!\r\n", ch ); return; } if ( !get_chap_from_quest( ( chapno - 1 ), quest ) && chapno > 1 ) { ch_printf( ch, "How can you create chapter %d before chapter %d even exists?\r\n", chapno, chapno - 1 ); return; } if ( chapno > quest->chapters ) { ch_printf( ch, "How can you create chapter %d when there are only %d chapters?\r\n", chapno, quest->chapters ); send_to_char( "Set more - 'setquest (questname) chapters (number)'.\r\n", ch ); return; } CREATE( chap, CHAP_DATA, 1 ); chap->number = chapno; add_chapter( quest, chap ); send_to_char( "New chapter added.\r\n", ch ); write_quest_list( ); return; } chap = get_chap_from_quest( chapno, quest ); if ( !chap ) { send_to_char( "No such chapter.\r\n", ch ); return; } if ( !str_cmp( arg4, "delete" ) ) { free_chapter( quest, chap ); send_to_char( "Chapter Deleted.\r\n", ch ); return; } if ( !str_cmp( arg4, "name" ) ) { if ( VLD_STR( chap->desc ) ) STRFREE( chap->desc ); if ( VLD_STR( argument ) ) { if ( strlen( argument ) > 50 ) argument[50] = '\0'; chap->desc = STRALLOC( argument ); } write_quest_list( ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg4, "timelimit" ) ) { x = atoi( argument ); if ( x < 0 || x > 3600 ) { send_to_char( "Time limit is between 0 and 3600 (one hour).\r\n", ch ); return; } chap->timelimit = x; send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg4, "kamount" ) ) { int kamount = atoi( argument ); if ( kamount < 0 ) { send_to_char( "You have to set kamount to 0 or higher.\r\n", ch ); return; } chap->kamount = kamount; send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg4, "level" ) ) { int level = atoi( argument ); if ( level < 0 || level > MAX_LEVEL ) { ch_printf( ch, "Level range is between 0 and %d.\r\n", MAX_LEVEL ); return; } chap->level = level; send_to_char( "Done.\r\n", ch ); return; } do_setquest( ch, ( char * ) "" ); return; } if ( !str_cmp( arg2, "level" ) ) { x = atoi( argument ); if ( x < 1 || x > MAX_LEVEL ) { send_to_char( "Quest level must be between 1 and max.\r\n", ch ); return; } quest->level = x; send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "timelimit" ) ) { x = atoi( argument ); if ( x < 0 || x > 3600 ) { send_to_char ( "Quest time limit must be between 0 (no timer) and 3600 seconds (1 hour).\r\n", ch ); return; } quest->timelimit = x; send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "remove" ) ) { CHAR_DATA *victim; CHQUEST_DATA *chquest; if ( ( victim = get_char_world( ch, argument ) ) != NULL && !IS_NPC( victim ) ) { x = get_number_from_quest( quest ); for ( chquest = victim->pcdata->first_quest; chquest; chquest = chquest->next ) { if ( chquest->questnum != quest->number ) continue; UNLINK( chquest, victim->pcdata->first_quest, victim->pcdata->last_quest, next, prev ); DISPOSE( chquest ); ch_printf( ch, "You remove quest %s from %s.\r\n", quest->name, victim->name ); ch_printf( victim, "Quest %s has been removed from your journal.\r\n", quest->name ); return; } send_to_char( "That player isn't currently on that quest.\r\n", ch ); return; } else send_to_char( "That player isn't currently online.\r\n", ch ); return; } do_setquest( ch, ( char * ) "" ); return; }
void do_gold( CHAR_DATA* ch, const char* argument) { set_char_color( AT_GOLD, ch ); ch_printf( ch, "You have %s gold pieces.\r\n", num_punct( ch->gold ) ); return; }
void do_add_imm_host( CHAR_DATA * ch, char *argument ) { char type[MAX_INPUT_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char *name; IMMORTAL_HOST *temp, *host; argument = one_argument( argument, type ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); set_char_color( AT_IMMORT, ch ); if( type[0] == '\0' ) { if( immortal_host_start == NULL ) { send_to_char( "No immortals are protected at this time.\r\n", ch ); return; } send_to_char( "Immortal Host\r\n", ch ); set_char_color( AT_PLAIN, ch ); for( temp = immortal_host_start; temp; temp = temp->next ) ch_printf( ch, "%-8s %c%s%c\r\n", temp->name, ( temp->prefix ? '*' : ' ' ), temp->host, ( temp->suffix ? '*' : ' ' ) ); return; } /* * Ok we have a new entry make sure it doesn't contain a ~ */ if( !str_cmp( type, "save" ) ) { do_write_imm_host( ); send_to_char( "Done.\r\n", ch ); return; } if( arg2[0] == '\0' || arg1[0] == '\0' ) { send_to_char( "Syntax: immhost add <name> <host>\r\n", ch ); send_to_char( "Syntax: immhost delete <name> <host>\r\n", ch ); send_to_char( "Syntax: immhost save\r\n", ch ); return; } if( !str_cmp( type, "delete" ) ) { IMMORTAL_HOST *it = NULL; for( temp = immortal_host_start; temp; temp = temp->next ) { if( !str_cmp( arg1, temp->name ) && !str_cmp( arg2, temp->host ) ) { it = temp; break; } } if( it == NULL ) { send_to_char( "Didn't find that entry.\r\n", ch ); return; } DISPOSE( temp->name ); DISPOSE( temp->host ); UNLINK( it, immortal_host_start, immortal_host_end, next, prev ); DISPOSE( it ); } else if( !str_cmp( type, "add" ) ) { bool prefix = FALSE, suffix = FALSE; int i; smash_tilde( arg1 ); smash_tilde( arg2 ); name = arg2; if( arg2[0] == '*' ) { prefix = TRUE; name++; } if( name[strlen( name ) - 1] == '*' ) { suffix = TRUE; name[strlen( name ) - 1] = '\0'; } arg1[0] = toupper( arg1[0] ); for( i = 0; i < ( int )strlen( name ); i++ ) name[i] = LOWER( name[i] ); for( temp = immortal_host_start; temp; temp = temp->next ) { if( !str_cmp( temp->name, arg1 ) && !str_cmp( temp->host, name ) ) { send_to_char( "Entry already exists.\r\n", ch ); return; } } CREATE( host, IMMORTAL_HOST, 1 ); host->name = str_dup( arg1 ); host->host = str_dup( name ); host->prefix = prefix; host->suffix = suffix; LINK( host, immortal_host_start, immortal_host_end, next, prev ); } else { send_to_char( "Syntax: immhost add <name> <host>\r\n", ch ); send_to_char( "Syntax: immhost delete <name> <host>\r\n", ch ); send_to_char( "Syntax: immhost save\r\n", ch ); return; } send_to_char( "Done.\r\n", ch ); return; }
/* Affects-at-a-glance, Blodkai */ void do_affected( CHAR_DATA* ch, const char* argument) { char arg[MAX_INPUT_LENGTH]; AFFECT_DATA *paf; SKILLTYPE *skill; if( IS_NPC( ch ) ) return; set_char_color( AT_SCORE, ch ); argument = one_argument( argument, arg ); if( !str_cmp( arg, "by" ) ) { send_to_char_color( "\r\n&BImbued with:\r\n", ch ); ch_printf_color( ch, "&C%s\r\n", !xIS_EMPTY( ch->affected_by ) ? affect_bit_name( &ch->affected_by ) : "nothing" ); if( ch->level >= 20 ) { send_to_char( "\r\n", ch ); if( ch->resistant > 0 ) { send_to_char_color( "&BResistances: ", ch ); ch_printf_color( ch, "&C%s\r\n", flag_string( ch->resistant, ris_flags ) ); } if( ch->immune > 0 ) { send_to_char_color( "&BImmunities: ", ch ); ch_printf_color( ch, "&C%s\r\n", flag_string( ch->immune, ris_flags ) ); } if( ch->susceptible > 0 ) { send_to_char_color( "&BSuscepts: ", ch ); ch_printf_color( ch, "&C%s\r\n", flag_string( ch->susceptible, ris_flags ) ); } } return; } if( !ch->first_affect ) { send_to_char_color( "\r\n&CNo cantrip or skill affects you.\r\n", ch ); } else { send_to_char( "\r\n", ch ); for( paf = ch->first_affect; paf; paf = paf->next ) if( ( skill = get_skilltype( paf->type ) ) != NULL ) { set_char_color( AT_BLUE, ch ); send_to_char( "Affected: ", ch ); set_char_color( AT_SCORE, ch ); if( ch->level >= 20 || IS_PKILL( ch ) ) { if( paf->duration < 25 ) set_char_color( AT_WHITE, ch ); if( paf->duration < 6 ) set_char_color( AT_WHITE + AT_BLINK, ch ); ch_printf( ch, "(%5d) ", paf->duration ); } ch_printf( ch, "%-18s\r\n", skill->name ); } } return; }