/* * New code for loading classes from file. */ bool fread_class( char *filename ) { FILE *fp; char *word; struct class_type *class; char buf [ MAX_STRING_LENGTH ]; bool fMatch; int stat; int number = -1; sprintf( buf, "Loading class: %s", filename ); log_string( buf ); sprintf( buf, "%s%s%s", data_directory, CLASS_DIR, filename ); if ( !( fp = fopen( buf, "r" ) ) ) { perror( buf ); return FALSE; } class = alloc_mem ( sizeof( CLASS_TYPE ) ); for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp, &stat ); fMatch = FALSE; switch ( UPPER( word[0] ) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "AtrPrm", class->attr_prime, fread_number( fp, &stat ) ); break; case 'C': KEY( "Cla", number, fread_number( fp, &stat ) ); if ( number < 0 || number >= MAX_CLASS ) { sprintf( buf, "Fread_class: bad class '%s'.", filename ); bug ( buf, 0 ); return FALSE; } break; case 'E': if ( !str_cmp( word, "End" ) ) { fclose( fp ); class_table[number] = class; return TRUE; } break; case 'H': KEY( "Hpmin", class->hp_min, fread_number( fp, &stat ) ); KEY( "Hpmax", class->hp_max, fread_number( fp, &stat ) ); break; case 'M': KEY( "Mana", class->fMana, fread_number( fp, &stat ) ); break; case 'N': SKEY( "Nm", class->name ); break; case 'S': KEY( "SkllAdpt", class->skill_adept, fread_number( fp, &stat ) ); if ( !str_cmp( word, "Skll" ) ) { int sn; int value; char *word; value = fread_number( fp, &stat ); sn = skill_lookup( (word = fread_word( fp, &stat )) ); if ( sn < 0 ) { sprintf( buf, "Fread_class - unknown skill: %s", word ); bug( buf, 0 ); } else skills_table[sn].skill_level[number] = value; fMatch = TRUE; } else if ( !str_cmp( word, "Spll" ) ) { int sn; int value; char *word; value = fread_number( fp, &stat ); sn = spell_lookup( (word = fread_word( fp, &stat )) ); if ( sn < 0 ) { sprintf( buf, "Fread_class - unknown spell: %s", word ); bug( buf, 0 ); } else { if( value <= MAX_CIRCLE && value > 0 ) { spells_table[sn].spell_circle[number] = value; } else { bug( "Spell in class file has level greater than MAX_CIRCLE", 0 ); spells_table[sn].spell_circle[number] = MAX_CIRCLE+2; } } fMatch = TRUE; } else if ( !str_cmp( word, "Song" ) ) { int sn; int value; char *word; value = fread_number( fp, &stat ); sn = song_lookup( (word = fread_word( fp, &stat )) ); if ( sn < 0 ) { sprintf( buf, "Fread_class - unknown song: %s", word ); bug( buf, 0 ); } else { if( value < MAX_LEVEL ) { songs_table[sn].spell_circle[number] = value; } else { bug( "Song in class file has level greater than MAX_LEVEL", 0 ); songs_table[sn].spell_circle[number] = MAX_LEVEL; } } fMatch = TRUE; } break; case 'T': KEY( "Thac0", class->thac0_00, fread_number( fp, &stat ) ); KEY( "Thac47", class->thac0_47, fread_number( fp, &stat ) ); break; case 'W': SKEY( "WhoNm", class->who_name ); KEY( "Wpn", class->weapon, fread_number( fp, &stat ) ); break; } if ( !fMatch ) { bugf( "load_class_file: no match: %s", word ); } }
void do_hex (CHAR_DATA * ch, char *argument, int cmd) { int sn; int duration, modifier; CHAR_DATA *tch; char buf[MAX_STRING_LENGTH]; if (!real_skill (ch, SKILL_HEX)) { send_to_char ("You shiver at the thought.\n\r", ch); return; } argument = one_argument (argument, buf); if (!(tch = get_char_room_vis (ch, buf))) { send_to_char ("You don't see that person here.\n\r", ch); return; } if (IS_MORTAL (ch) && !IS_MORTAL (tch)) { send_to_char ("Immortals are total losers. It can't get any worse for them.\n\r", ch); return; } if (GET_HIT (ch) + GET_MOVE (ch) <= 35) { send_to_char ("You can't concentrate hard enough for that right now.\n\r", ch); return; } sprintf (buf, "Hexing %s", tch->tname); weaken (ch, 0, 20, buf); sense_activity (ch, SKILL_HEX); if (!skill_use (ch, SKILL_HEX, 0)) { send_to_char ("You lose your concentration, and your malignant energies dissipate.\n", ch); return; } act ("You channel a stream of malignant psychic energy into $N, entwining $M in an ethereal web of ill-fortune and grief.", false, ch, 0, tch, TO_CHAR | _ACT_FORMAT); act ("A chill runs down your spine.", false, ch, 0, tch, TO_VICT); sn = spell_lookup ("curse"); modifier = ch->skills[SKILL_HEX] / 5 + number (1, 10); duration = ch->skills[SKILL_HEX] / 5 + number (1, 48); magic_add_affect (tch, MAGIC_AFFECT_CURSE, duration, modifier, 0, 0, sn); tch->curse += ch->skills[SKILL_HEX] / 5 + number (1, 5); }