예제 #1
0
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;
}
예제 #2
0
/* 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;
}
예제 #3
0
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 );
}
예제 #4
0
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;
}
예제 #5
0
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;
}
예제 #6
0
/* 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;
}
예제 #7
0
/* 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;
}