#if defined( macintosh ) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <string.h> #include <time.h> #include "merc.h" void spell_imprint( int sn, int level, CHAR_DATA *ch, void *vo ); void do_brew ( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int sn; if ( !IS_NPC( ch ) && ch->level < skill_table[gsn_brew].skill_level[ch->class] ) { send_to_char( "You do not know how to brew potions.\n\r", ch ); return; } argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Brew what spell?\n\r", ch ); return; } /* Do we have a vial to brew potions? */ for ( obj = ch->carrying; obj; obj = obj->next_content ) { if ( obj->item_type == ITEM_POTION && obj->wear_loc == WEAR_HOLD ) break; } /* Interesting ... Most scrolls/potions in the mud have no hold flag; so, the problem with players running around making scrolls with 3 heals or 3 gas breath from pre-existing scrolls has been severely reduced. Still, I like the idea of 80% success rate for first spell imprint, 25% for 2nd, and 10% for 3rd. I don't like the idea of a scroll with 3 ultrablast spells; although, I have limited its applicability when I reduced the spell->level to 1/3 and 1/4 of ch->level for scrolls and potions respectively. --- JH */ /* I will just then make two items, an empty vial and a parchment available in midgaard shops with holdable flags and -1 for each of the 3 spell slots. Need to update the midgaard.are files --- JH */ if ( !obj ) { send_to_char( "You are not holding a vial.\n\r", ch ); return; } if ( ( sn = skill_lookup(arg) ) < 0) { send_to_char( "You don't know any spells by that name.\n\r", ch ); return; } /* preventing potions of gas breath, acid blast, etc.; doesn't make sense when you quaff a gas breath potion, and then the mobs in the room are hurt. Those TAR_IGNORE spells are a mixed blessing. - JH */ /* Well I (maniac) think you should be able to do so... so I comment it out.. if ( (skill_table[sn].target != TAR_CHAR_DEFENSIVE) && (skill_table[sn].target != TAR_CHAR_SELF) ) { send_to_char( "You cannot brew that spell.\n\r", ch ); return; } *** So much for commenting it out... */ act( "$n begins preparing a potion.", ch, obj, NULL, TO_ROOM ); WAIT_STATE( ch, skill_table[gsn_brew].beats ); /* Check the skill percentage, fcn(wis,int,skill) */ if ( ch->level < L_SEN) { if ( !IS_NPC(ch) && ( number_percent( ) > ch->pcdata->learned[gsn_brew] || number_percent( ) > ((get_curr_int(ch)-13)*5 + (get_curr_wis(ch)-13)*3) )) { act( "$p explodes violently!", ch, obj, NULL, TO_CHAR ); act( "$p explodes violently!", ch, obj, NULL, TO_ROOM ); spell_acid_blast(skill_lookup("acid blast"), LEVEL_HERO - 1, ch, ch); extract_obj( obj ); return; } } /* took this outside of imprint codes, so I can make do_brew differs from do_scribe; basically, setting potion level and spell level --- JH */ obj->level = ch->level/2; obj->value[0] = ch->level/4; spell_imprint(sn, ch->level, ch, obj); } void do_scribe ( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int sn; if ( !IS_NPC( ch ) && ch->level < skill_table[gsn_scribe].skill_level[ch->class] ) { send_to_char( "You do not know how to scribe scrolls.\n\r", ch ); return; } argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Scribe what spell?\n\r", ch ); return; } /* Do we have a parchment to scribe spells? */ for ( obj = ch->carrying; obj; obj = obj->next_content ) { if ( obj->item_type == ITEM_SCROLL && obj->wear_loc == WEAR_HOLD ) break; } if ( !obj ) { send_to_char( "You are not holding a parchment.\n\r", ch ); return; } if ( ( sn = skill_lookup(arg) ) < 0) { send_to_char( "You don't know any spells by that name.\n\r", ch ); return; } act( "$n begins writing a scroll.", ch, obj, NULL, TO_ROOM ); WAIT_STATE( ch, skill_table[gsn_scribe].beats ); /* Check the skill percentage, fcn(int,wis,skill) */ if ( ch->level < L_SEN ) { if ( !IS_NPC(ch) && ( number_percent( ) > ch->pcdata->learned[gsn_brew] || number_percent( ) > ((get_curr_int(ch)-13)*5 + (get_curr_wis(ch)-13)*3) )) { act( "$p bursts in flames!", ch, obj, NULL, TO_CHAR ); act( "$p bursts in flames!", ch, obj, NULL, TO_ROOM ); spell_fireball(skill_lookup("fireball"), LEVEL_HERO - 1, ch, ch); extract_obj( obj ); return; } } /* basically, making scrolls more potent than potions; also, scrolls are not limited in the choice of spells, i.e. scroll of enchant weapon has no analogs in potion forms --- JH */ obj->level = ch->level*2/3; obj->value[0] = ch->level/3; spell_imprint(sn, ch->level, ch, obj); } void spell_imprint( int sn, int level, CHAR_DATA *ch, void *vo ) { OBJ_DATA *obj = (OBJ_DATA *) vo; int sp_slot, i, mana; char buf[ MAX_STRING_LENGTH ]; if (skill_table[sn].spell_fun == spell_null ) { send_to_char("That is not a spell.\n\r",ch); return; } /* counting the number of spells contained within */ for (sp_slot = i = 1; i < 4; i++) if (obj->value[i] != -1) sp_slot++; if (sp_slot > 3) { act ("$p cannot contain any more spells.", ch, obj, NULL, TO_CHAR); return; } /* scribe/brew costs 4 times the normal mana required to cast the spell */ mana = 4 * MANA_COST(ch, sn); if ( !IS_NPC(ch) && ch->mana < mana ) { send_to_char( "You don't have enough mana.\n\r", ch ); return; } if ((number_percent() > ch->pcdata->learned[sn]) && (ch->level < L_SEN)) { send_to_char( "You lost your concentration.\n\r", ch ); ch->mana -= mana / 2; return; } /* executing the imprinting process */ ch->mana -= mana; obj->value[sp_slot] = sn; /* Making it successively harder to pack more spells into potions or scrolls - JH */ if (ch->level < L_SEN ) { switch( sp_slot ) { default: bug( "sp_slot has more than %d spells.", sp_slot ); return; case 1: if ( number_percent() > 80 ) { sprintf(buf, "The magic enchantment has failed --- the %s vanishes.\n\r", item_type_name(obj) ); send_to_char( buf, ch ); extract_obj( obj ); return; } break; case 2: if ( number_percent() > 25 ) { sprintf(buf, "The magic enchantment has failed --- the %s vanishes.\n\r", item_type_name(obj) ); send_to_char( buf, ch ); extract_obj( obj ); return; } break; case 3: if ( number_percent() > 10 ) { sprintf(buf, "The magic enchantment has failed --- the %s vanishes.\n\r", item_type_name(obj) ); send_to_char( buf, ch ); extract_obj( obj ); return; } break; } } /* If level < L_SEN */ /* labeling the item */ free_string (obj->short_descr); sprintf ( buf, "a %s of ", item_type_name(obj) ); for (i = 1; i <= sp_slot ; i++) if (obj->value[i] != -1) { strcat (buf, skill_table[obj->value[i]].name); (i != sp_slot ) ? strcat (buf, ", ") : strcat (buf, "") ; } obj->short_descr = str_dup(buf); sprintf( buf, "%s %s", obj->name, item_type_name(obj) ); free_string( obj->name ); obj->name = str_dup( buf ); sprintf(buf, "You have imbued a new spell to the %s.\n\r", item_type_name(obj) ); send_to_char( buf, ch ); return; } /* Study skill... converted from Rom by Maniac */ void do_study( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; OBJ_DATA *scroll; argument = one_argument(argument, arg1); if (( scroll = get_obj_carry(ch,arg1)) == NULL) { send_to_char("You don't have that scroll.\n\r",ch); return; } if ( scroll->item_type != ITEM_SCROLL ) { send_to_char("You can only study scrolls.\n\r",ch); return; } if ( ch->level < scroll->level ) { send_to_char("You are not a high enough level to use this scroll.\n\r", ch ); return; } if (( skill_table[scroll->value[1]].skill_level[ch->class] >= 72 ) && ( !IS_IMMORTAL(ch) )) { send_to_char("Your class may not learn that spell.\n\r",ch); return; } if ( skill_table[scroll->value[1]].skill_level[ch->class] > ch->level ) { send_to_char("This spell is beyond your grasp. Perhaps in a few levels...\n\r", ch ); return; } if ( ch->pcdata->learned[scroll->value[1]] > 0 ) { send_to_char("You know that spell already!\n\r",ch); return; } act("$n studies $p.",ch,scroll,NULL,TO_ROOM); act("You study $p.",ch,scroll,NULL,TO_CHAR); if (number_percent() >= (20 + ch->pcdata->learned[gsn_scrolls]) * 4/5) { send_to_char("You mess up and the scroll vanishes!\n\r",ch); act("$n screams in anger.",ch,NULL,NULL,TO_ROOM); /* check_improve(ch,gsn_scrolls,FALSE,2); */ } else { act("You learn the spell!",ch,NULL,NULL,TO_CHAR); act("$n learned the spell!",ch,NULL,NULL,TO_ROOM); ch->pcdata->learned[scroll->value[1]] = 5; /* ch->pcdata->points += 3; */ /* check_improve(ch,gsn_scrolls,TRUE,2); */ } extract_obj(scroll); return; }