void do_classes( CHAR_DATA *ch, char *argument ) { int iClass = 0; int counter = 0; if ( !IS_IMMORTAL( ch ) ) counter = 1; send_to_pager( "\r\n", ch ); for ( iClass = 0; iClass < MAX_PC_CLASS; iClass++ ) { if ( !class_table[iClass] || !VLD_STR( class_table[iClass]->who_name ) ) { if ( IS_IMMORTAL( ch ) ) counter++; continue; } pager_printf( ch, "&c[&C%2d&c]&W %-15s", counter, class_table[iClass]->who_name ); if ( IS_IMMORTAL( ch ) ) pager_printf( ch, " &cStarting:&W%3s &cExpbase:&W %-5d &cPrime: &W%-14s &cMana: &W%2d-%-2d", class_table[iClass]->starting ? "Yes" : "No", class_table[iClass]->exp_base, a_types[class_table[iClass]->attr_prime], class_table[iClass]->mana_min, class_table[iClass]->mana_max ); pager_printf( ch, "&D\r\n" ); counter++; } return; }
/* Create a new class online. -Shaddai */ bool create_new_class( int Class, char *argument ) { int i; if ( Class >= MAX_CLASS || class_table[Class] == NULL || !VLD_STR( argument ) ) return FALSE; if ( class_table[Class]->who_name ) STRFREE( class_table[Class]->who_name ); if ( class_table[Class]->filename ) STRFREE( class_table[Class]->filename ); if ( argument[0] != '\0' ) argument[0] = UPPER( argument[0] ); class_table[Class]->who_name = STRALLOC( argument ); class_table[Class]->filename = STRALLOC( argument ); xCLEAR_BITS( class_table[Class]->affected ); class_table[Class]->attr_prime = 0; class_table[Class]->attr_second = 0; class_table[Class]->attr_deficient = 0; class_table[Class]->race_restriction = 0; class_table[Class]->combo_restriction = 0; class_table[Class]->resist = 0; class_table[Class]->suscept = 0; class_table[Class]->skill_adept = 0; class_table[Class]->thac0_00 = 0; class_table[Class]->thac0_32 = 0; class_table[Class]->hp_min = 0; class_table[Class]->hp_max = 0; class_table[Class]->mana_min = 0; class_table[Class]->mana_max = 0; class_table[Class]->starting = FALSE; /* Default to not a starting class */ class_table[Class]->exp_base = 0; class_table[Class]->craft_base = 0; for ( i = 0; i < MAX_LEVEL; i++ ) { title_table[Class][i][0] = STRALLOC( "Not set." ); title_table[Class][i][1] = STRALLOC( "Not set." ); } return TRUE; }
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; }
bool load_class_file( const char *fname ) { char buf[MSL]; const char *word; bool fMatch; struct class_type *Class; int cl = -1, tlev = 0; FILE *fp; snprintf( buf, MSL, "%s%s", CLASSDIR, fname ); if ( ( fp = FileOpen( buf, "r" ) ) == NULL ) { perror( buf ); return FALSE; } CREATE( Class, struct class_type, 1 ); /* * Setup defaults for additions to class structure */ Class->starting = FALSE; Class->attr_second = 0; Class->attr_deficient = 0; xCLEAR_BITS( Class->affected ); Class->resist = 0; Class->suscept = 0; for ( ;; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Affected", Class->affected, fread_bitvector( fp ) ); KEY( "AttrPrime", Class->attr_prime, fread_number( fp ) ); KEY( "AttrSecond", Class->attr_second, fread_number( fp ) ); KEY( "AttrDeficient", Class->attr_deficient, fread_number( fp ) ); break; case 'C': KEY( "Class", cl, fread_number( fp ) ); KEY( "Craftbase", Class->craft_base, fread_number( fp ) ); break; case 'E': if ( !str_cmp( word, "End" ) ) if ( !str_cmp( word, "End" ) ) { FileClose( fp ); if ( cl < 0 || cl >= MAX_CLASS ) { bug( "Load_class_file: Class (%s) bad/not found (%d)", Class->who_name ? Class->who_name : "name not found", cl ); if ( VLD_STR( Class->who_name ) ) STRFREE( Class->who_name ); if ( VLD_STR( Class->filename ) ) STRFREE( Class->filename ); DISPOSE( Class ); return FALSE; } if ( !Class->filename ) Class->filename = STRALLOC( Class->who_name ); class_table[cl] = Class; return TRUE; } KEY( "ExpBase", Class->exp_base, fread_number( fp ) ); break; case 'F': KEY( "Filename", Class->filename, fread_string( fp ) ); case 'H': KEY( "HpMax", Class->hp_max, fread_number( fp ) ); KEY( "HpMin", Class->hp_min, fread_number( fp ) ); break; case 'M': KEY( "ManaMax", Class->mana_max, fread_number( fp ) ); KEY( "ManaMin", Class->mana_min, fread_number( fp ) ); break; case 'N': KEY( "Nocombo", Class->combo_restriction, fread_number( fp ) ); KEY( "Name", Class->who_name, fread_string( fp ) ); break; case 'R': KEY( "Races", Class->race_restriction, fread_number( fp ) ); if ( !str_cmp( word, "Reclass" ) ) { Class->reclass1 = fread_number( fp ); Class->reclass2 = fread_number( fp ); Class->reclass3 = fread_number( fp ); fMatch = TRUE; break; } KEY( "Resist", Class->resist, fread_number( fp ) ); break; case 'S': KEY( "Starting", Class->starting, fread_number( fp ) ); if ( !str_cmp( word, "Skill" ) ) { int sn, lev, adp; word = fread_word( fp ); lev = fread_number( fp ); adp = fread_number( fp ); sn = skill_lookup( word ); if ( cl < 0 || cl >= MAX_CLASS ) bug( "load_class_file: Skill %s -- class bad/not found (%d)", word, cl ); else if ( !IS_VALID_SN( sn ) ) bug( "load_class_file: Skill %s unknown", word ); else { skill_table[sn]->skill_level[cl] = lev; skill_table[sn]->skill_adept[cl] = adp; } fMatch = TRUE; break; } KEY( "Skilladept", Class->skill_adept, fread_number( fp ) ); KEY( "Suscept", Class->suscept, fread_number( fp ) ); break; case 'T': if ( !str_cmp( word, "Title" ) ) { if ( cl < 0 || cl >= MAX_CLASS ) { char *tmp; bug( "load_class_file: Title -- class bad/not found (%d)", cl ); tmp = fread_string( fp ); DISPOSE( tmp ); tmp = fread_string( fp ); DISPOSE( tmp ); } else if ( tlev < MAX_LEVEL + 1 ) { title_table[cl][tlev][0] = fread_string( fp ); title_table[cl][tlev][1] = fread_string( fp ); ++tlev; } else bug( "%s", "load_class_file: Too many titles" ); fMatch = TRUE; break; } KEY( "Thac0", Class->thac0_00, fread_number( fp ) ); KEY( "Thac32", Class->thac0_32, fread_number( fp ) ); break; } if ( !fMatch ) { bug( "load_class_file: no match: %s", word ); fread_to_eol( fp ); } } return FALSE; }
/* Display class information -Thoric */ void do_showclass( CHAR_DATA *ch, char *argument ) { char arg1[MIL], arg2[MIL]; struct class_type *Class; int cl, low, hi, ct, i; set_pager_color( AT_PLAIN, ch ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( !VLD_STR( arg1 ) ) { do_classes( ch, ( char * ) "" ); send_to_char( "Syntax: showclass <class> [level range]\r\n", ch ); return; } if ( is_number( arg1 ) && ( cl = atoi( arg1 ) ) >= 0 && cl < MAX_CLASS ) Class = class_table[cl]; else { Class = NULL; for ( cl = 0; cl < MAX_CLASS && class_table[cl]; cl++ ) if ( !str_cmp( class_table[cl]->who_name, arg1 ) ) { Class = class_table[cl]; break; } } if ( !Class ) { send_to_char( "No such class.\r\n", ch ); return; } pager_printf( ch, "&wCLASS: &W%s\r\n&w", VLD_STR( Class->who_name ) ? Class->who_name : "(Not set)" ); pager_printf( ch, "&wFilename: &W%s\r\n&w", VLD_STR( Class->filename ) ? Class->filename : "(Not set)" ); pager_printf( ch, "&wPrime Attribute: &W%-14s\r\n", a_types[Class->attr_prime] ); pager_printf( ch, "&wSecond Attribute: &W%-14s\r\n", a_types[Class->attr_second] ); pager_printf( ch, "&wDeficient Attribute: &W%-14s\r\n", a_types[Class->attr_deficient] ); ct = 0; send_to_pager( "&wDisallowed Races:&W\r\n", ch ); for ( i = 0; i < MAX_RACE; i++ ) { if ( IS_SET( Class->race_restriction, 1 << i ) ) { ct++; pager_printf( ch, "%10s ", race_table[i]->race_name ); if ( ct % 6 == 0 ) send_to_pager( "\r\n", ch ); } } if ( ( ct % 6 != 0 ) || ( ct == 0 ) ) send_to_pager( "\r\n", ch ); ct = 0; send_to_pager( "&wAllowed Races:&W\r\n", ch ); for ( i = 0; i < MAX_RACE; i++ ) { if ( !IS_SET( Class->race_restriction, 1 << i ) ) { ct++; pager_printf( ch, "%10s ", race_table[i]->race_name ); if ( ct % 6 == 0 ) send_to_pager( "\r\n", ch ); } } // Added in combo restrictions by: Taon... /* if((ct % 6 != 0) || (ct == 0)) send_to_pager("\r\n", ch); ct = 0; send_to_pager("&wAllowed combos:&W\r\n", ch); for(i = 0; i < MAX_CLASS; i++) { ct++; if(!IS_SET(Class->combo_restriction, 1 << i)) { pager_printf(ch, "%10s ", class_table[i]->who_name); send_to_pager("\r\n", ch); } } if((ct % 6 != 0) || (ct == 0)) send_to_pager("\r\n", ch); ct = 0; send_to_pager("&wNot Allowed combos:&W\r\n", ch); for(i = 0; i < MAX_CLASS; i++) { ct++; if(IS_SET(Class->combo_restriction, 1 << i)) { pager_printf(ch, "%10s ", class_table[i]->who_name); send_to_pager("\r\n", ch); } } */ send_to_char( "\r\n", ch ); pager_printf( ch, "&wMax Skill Adept: &W%-3d &wThac0 : &W%-5d &wThac32: &W%d\r\n", Class->skill_adept, Class->thac0_00, Class->thac0_32 ); pager_printf( ch, "&wHp Min/Hp Max : &W%-2d/%-2d &wMana Min/Max: &W%-2d/%-2d &wExpBase: &W%d\r\n", Class->hp_min, Class->hp_max, Class->mana_min, Class->mana_max, Class->exp_base ); pager_printf( ch, "&W%s &wClass\r\n", Class->starting ? "Starting" : "Non-Starting" ); pager_printf( ch, "&wAffected by: &W%s\r\n", !xIS_EMPTY( Class->affected ) ? ext_flag_string( &Class->affected, a_flags ) : "Nothing" ); pager_printf( ch, "&wResistant to: &W%s\r\n", flag_string( Class->resist, ris_flags ) ); pager_printf( ch, "&wSusceptible to: &W%s\r\n", flag_string( Class->suscept, ris_flags ) ); pager_printf( ch, "&wCrafting Base: &W%d\r\n", Class->craft_base ); /* * These are no longer in use. -Taon if(Class->reclass1 > 0) pager_printf(ch, "%s ", * class_table[class->reclass1]->who_name); if(Class->reclass2 > 0) pager_printf(ch, * "%s ", class_table[class->reclass2]->who_name); if(Class->reclass3 > 0) * pager_printf(ch, "%s ", class_table[class->reclass3]->who_name); * send_to_pager("\r\n", ch); */ /* if(VLD_STR(arg2)) { int x, y, cnt; low = UMAX(0, atoi(arg2)); hi = URANGE(low, atoi(argument), MAX_LEVEL); for(x = low; x <= hi; x++) { set_pager_color(AT_LBLUE, ch); pager_printf(ch, "Male: %-30s Female: %s\r\n", title_table[cl][x][0], title_table[cl][x][1]); cnt = 0; set_pager_color(AT_BLUE, ch); for(y = gsn_first_spell; y < gsn_top_sn; y++) if(skill_table[y]->skill_level[cl] == x) { pager_printf(ch, " %-7s %-19s%3d ", skill_tname[skill_table[y]->type], skill_table[y]->name, skill_table[y]->skill_adept[cl]); if(++cnt % 2 == 0) send_to_pager("\r\n", ch); if(cnt % 2 != 0) send_to_pager("\r\n", ch); send_to_pager("\r\n", ch); } } } */ if ( arg2 && arg2[0] != '\0' ) { int x, y, cnt; low = UMAX( 0, atoi( arg2 ) ); hi = URANGE( low, atoi( argument ), MAX_LEVEL ); for ( x = low; x <= hi; x++ ) { pager_printf( ch, "&wMale: &W%-30s &wFemale: &W%s\r\n", title_table[cl][x][0], title_table[cl][x][1] ); cnt = 0; for ( y = gsn_first_spell; y < gsn_top_sn; y++ ) if ( skill_table[y]->skill_level[cl] == x ) { pager_printf( ch, " &[skill]%-7s %-19s%3d ", skill_tname[skill_table[y]->type], skill_table[y]->name, skill_table[y]->skill_adept[cl] ); if ( ++cnt % 2 == 0 ) send_to_pager( "\r\n", ch ); } if ( cnt % 2 != 0 ) send_to_pager( "\r\n", ch ); send_to_pager( "\r\n", ch ); } } return; }
/* Edit class information -Thoric */ void do_setclass( CHAR_DATA *ch, char *argument ) { char arg1[MIL]; char arg2[MIL]; struct class_type *Class; int cl, value, i; set_char_color( AT_PLAIN, ch ); smash_tilde( argument ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( !VLD_STR( arg1 ) ) { send_to_char( "Syntax: setclass <class> <field> <value>\r\n", ch ); send_to_char( "Syntax: setclass <class> create\r\n", ch ); send_to_char( "\r\nField being one of:\r\n", ch ); send_to_char( " name filename prime thac0 thac32 nocombo\r\n", ch ); send_to_char( " hpmin hpmax manamin manamax expbase mtitle ftitle\r\n", ch ); send_to_char( " second, deficient affected resist suscept\r\n", ch ); send_to_char( " race starting reclass1 reclass2 reclass3\r\n", ch ); return; } if ( is_number( arg1 ) && ( cl = atoi( arg1 ) ) >= 0 && cl < MAX_CLASS ) Class = class_table[cl]; else { Class = NULL; for ( cl = 0; cl < MAX_CLASS && class_table[cl]; cl++ ) { if ( !class_table[cl]->who_name ) continue; if ( !str_cmp( class_table[cl]->who_name, arg1 ) ) { Class = class_table[cl]; break; } } } if ( !str_cmp( arg2, "create" ) && Class ) { send_to_char( "That class already exists!\r\n", ch ); return; } if ( !Class && str_cmp( arg2, "create" ) ) { send_to_char( "No such class.\r\n", ch ); return; } if ( !str_cmp( arg2, "save" ) ) { DESCRIPTOR_DATA *d; write_class_file( cl ); send_to_char( "&CUpdating class for all players now.\r\n", ch ); for ( d = first_descriptor; d; d = d->next ) { if ( d->character ) update_aris( d->character ); } return; } if ( !str_cmp( arg2, "create" ) ) { if ( MAX_PC_CLASS >= MAX_CLASS ) { send_to_char( "You need to up MAX_CLASS in mud and make clean.\r\n", ch ); return; } if ( ( create_new_class( MAX_PC_CLASS, arg1 ) ) == FALSE ) { send_to_char( "Couldn't create a new class.\r\n", ch ); return; } write_class_file( MAX_PC_CLASS ); MAX_PC_CLASS++; write_class_list( ); send_to_char( "Done.\r\n", ch ); return; } if ( !argument ) { send_to_char( "You must specify an argument.\r\n", ch ); return; } if ( !str_cmp( arg2, "name" ) ) { if ( !VLD_STR( argument ) ) { send_to_char( "Can't set a class name to nothing.\r\n", ch ); return; } if ( VLD_STR( Class->who_name ) ) STRFREE( Class->who_name ); Class->who_name = STRALLOC( ( argument ) ); send_to_char( "Class name is set.\r\n", ch ); return; } if ( !str_cmp( arg2, "filename" ) ) { if ( !VLD_STR( argument ) ) { send_to_char( "Can't set a filename to nothing.\r\n", ch ); return; } if ( VLD_STR( Class->filename ) ) STRFREE( Class->filename ); Class->filename = STRALLOC( ( argument ) ); send_to_char( "Filename is set.\r\n", ch ); return; } if ( !str_cmp( arg2, "starting" ) ) { Class->starting = !Class->starting; ch_printf( ch, "That class is now a %s class.\r\n", Class->starting ? "starting" : "non-starting" ); return; } // Start of the nocombo aurgument! -Taon if ( !str_cmp( arg2, "nocombo" ) ) { for ( i = 0; i < MAX_CLASS; i++ ) { if ( class_table[i] && VLD_STR( class_table[i]->who_name ) ) { if ( !str_cmp( argument, class_table[i]->who_name ) ) { TOGGLE_BIT( Class->combo_restriction, 1 << i ); send_to_char( "Done!\r\n", ch ); send_to_char ( "Note this still isnt complete, as far as the nanny function is concerned!\r\n", ch ); return; } } } return; } if ( !str_cmp( arg2, "race" ) ) { for ( i = 0; i < MAX_RACE; i++ ) { if ( !str_cmp( argument, race_table[i]->race_name ) ) { TOGGLE_BIT( Class->race_restriction, 1 << i ); /* k, that's boggling */ send_to_char( "Done.\r\n", ch ); return; } } send_to_char( "No such race.\r\n", ch ); return; } if ( !str_cmp( arg2, "reclass1" ) ) { Class->reclass1 = 0; for ( i = 0; i < MAX_CLASS; i++ ) { if ( class_table[i] && VLD_STR( class_table[i]->who_name ) ) { if ( !str_cmp( argument, class_table[i]->who_name ) ) { Class->reclass1 = i; send_to_char( "Done.\r\n", ch ); return; } } } send_to_char( "No such class. Reclass1 cleared.\r\n", ch ); return; } if ( !str_cmp( arg2, "reclass2" ) ) { Class->reclass2 = 0; for ( i = 0; i < MAX_CLASS; i++ ) { if ( class_table[i] && VLD_STR( class_table[i]->who_name ) ) { if ( !str_cmp( argument, class_table[i]->who_name ) ) { Class->reclass2 = i; send_to_char( "Done.\r\n", ch ); return; } } } send_to_char( "No such class. Reclass2 cleared.\r\n", ch ); return; } if ( !str_cmp( arg2, "reclass3" ) ) { Class->reclass3 = 0; for ( i = 0; i < MAX_CLASS; i++ ) { if ( class_table[i] && VLD_STR( class_table[i]->who_name ) ) { if ( !str_cmp( argument, class_table[i]->who_name ) ) { Class->reclass3 = i; send_to_char( "Done.\r\n", ch ); return; } } } send_to_char( "No such class. Reclass3 cleared.\r\n", ch ); return; } if ( !str_cmp( arg2, "second" ) ) { int x = get_atype( argument ); if ( x < APPLY_STR || ( x > APPLY_CON && x != APPLY_LCK && x != APPLY_CHA ) ) send_to_char( "Invalid second attribute!\r\n", ch ); else { Class->attr_second = x; send_to_char( "Done.\r\n", ch ); } return; } if ( !str_cmp( arg2, "affected" ) ) { if ( !VLD_STR( argument ) ) { send_to_char( "Usage: setclass <class> affected <flag> [flag]...\r\n", ch ); return; } while ( VLD_STR( argument ) ) { argument = one_argument( argument, arg2 ); value = get_aflag( arg2 ); if ( value < 0 || value > MAX_BITS ) ch_printf( ch, "Unknown flag: %s\r\n", arg2 ); else xTOGGLE_BIT( Class->affected, value ); } send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "resist" ) ) { if ( !VLD_STR( argument ) ) { send_to_char( "Usage: setclass <class> resist <flag> [flag]...\r\n", ch ); return; } while ( VLD_STR( argument ) ) { argument = one_argument( argument, arg2 ); value = get_risflag( arg2 ); if ( value < 0 || value > 31 ) ch_printf( ch, "Unknown flag: %s\r\n", arg2 ); else TOGGLE_BIT( Class->resist, 1 << value ); } send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "suscept" ) ) { if ( !VLD_STR( argument ) ) { send_to_char( "Usage: setclass <class> suscept <flag> [flag]...\r\n", ch ); return; } while ( VLD_STR( argument ) ) { argument = one_argument( argument, arg2 ); value = get_risflag( arg2 ); if ( value < 0 || value > 31 ) ch_printf( ch, "Unknown flag: %s\r\n", arg2 ); else TOGGLE_BIT( Class->suscept, 1 << value ); } send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "deficient" ) ) { int x = get_atype( argument ); if ( x < APPLY_STR || ( x > APPLY_CON && x != APPLY_LCK && x != APPLY_CHA ) ) send_to_char( "Invalid deficient attribute!\r\n", ch ); else { Class->attr_deficient = x; send_to_char( "Done.\r\n", ch ); } return; } if ( !str_cmp( arg2, "prime" ) ) { int x = get_atype( argument ); if ( x < APPLY_STR || ( x > APPLY_CON && x != APPLY_LCK && x != APPLY_CHA ) ) send_to_char( "Invalid prime attribute!\r\n", ch ); else { Class->attr_prime = x; send_to_char( "Done.\r\n", ch ); } return; } if ( !str_cmp( arg2, "thac0" ) ) { Class->thac0_00 = atoi( argument ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "thac32" ) ) { Class->thac0_32 = atoi( argument ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "hpmin" ) ) { Class->hp_min = atoi( argument ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "hpmax" ) ) { Class->hp_max = atoi( argument ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "manamin" ) ) { Class->mana_min = atoi( argument ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "manamax" ) ) { Class->mana_max = atoi( argument ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "expbase" ) ) { Class->exp_base = atoi( argument ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "craftbase" ) ) { Class->craft_base = atoi( argument ); send_to_char( "Craft base is now set.\r\n", ch ); return; } if ( !str_cmp( arg2, "mtitle" ) ) { char arg3[MIL]; int x; argument = one_argument( argument, arg3 ); if ( arg3[0] == '\0' || argument[0] == '\0' ) { send_to_char( "Syntax: setclass <class> mtitle <level> <title>\r\n", ch ); return; } if ( !VLD_STR( argument ) ) { send_to_char( "What would you like to set the mtitle_table to?\r\n", ch ); return; } if ( ( x = atoi( arg3 ) ) < 0 || x > MAX_LEVEL ) { send_to_char( "Invalid level.\r\n", ch ); return; } STRFREE( title_table[cl][x][0] ); title_table[cl][x][0] = STRALLOC( argument ); send_to_char( "Done.\r\n", ch ); return; } if ( !str_cmp( arg2, "ftitle" ) ) { char arg3[MIL]; int x; argument = one_argument( argument, arg3 ); if ( arg3[0] == '\0' || argument[0] == '\0' ) { send_to_char( "Syntax: setclass <class> ftitle <level> <title>\r\n", ch ); return; } if ( !VLD_STR( argument ) ) { send_to_char( "What would you like to set the ftitle_table to?\r\n", ch ); return; } if ( ( x = atoi( arg3 ) ) < 0 || x > MAX_LEVEL ) { send_to_char( "Invalid level.\r\n", ch ); return; } STRFREE( title_table[cl][x][1] ); title_table[cl][x][1] = STRALLOC( argument ); send_to_char( "Done.\r\n", ch ); return; } do_setclass( ch, ( char * ) "" ); return; }