/* This snippet has been ported over from a Smaug 1.4a codebase. Oridinal Snippet by GenmaC. While his/her snippet calls for 'do_study', I've changed the command to 'do_research' so that it will work together with the already 'do_study' command that is in play. Credit goes to GenmaC for the original code and Raven Nightshade of Depths of Chaos Mud for the porting to LoP format. I have tested all three ITEMS; wands, scrolls, and staves, and have not discovered any issues. Compiling was clean. */ */ /* in db.c, add into your short gsn listings*/ short gsn_research; /* in db.c, add into your ASSIGN_GSN listings */ ASSIGN_GSN( gsn_research, "research" ); /* in mud.h, add into your extern short listings */ extern short gsn_research; /* Research Skill */ /* Be sure to create a skill called, 'research' with the 'do_research' code. Be warned that this skill can unbalance things if you leave a lot of powerful spell scrolls around for lower level players - however, it will give them the spell at a very low percentage, so it won't be too powerful if used properly. */ /* in act_obj.c, ADD at the bottom of file: */ /* do_research - research skill. */ CMDF ( do_research ) { char arg[MIL]; OBJ_DATA *obj; int sn = 0; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Research what?\n\r", ch ); return; } if ( ( obj = get_obj_carry( ch, arg ) ) == NULL ) { send_to_char( "You do not have that item.\n\r", ch ); return; } if ( obj->item_type != ITEM_STAFF && obj->item_type != ITEM_WAND && obj->item_type != ITEM_SCROLL ) { send_to_char( "You can only research scrolls, wands, and staves.\n\r", ch ); return; } act( AT_PLAIN, "$n researches $p.", ch, obj, NULL, TO_NOTVICT ); act( AT_PLAIN, "You research $p.", ch, obj, NULL, TO_CHAR ); if (ch->level < obj->level) /* if character level lower than object level, fail */ { send_to_char("You cannot glean any knowledge from it.\n\r",ch); act( AT_PLAIN, "$p burns brightly and is gone.", ch, obj, NULL, TO_CHAR ); separate_obj( obj ); extract_obj( obj ); } if (obj->item_type == ITEM_STAFF) { sn = obj->value[3]; if ( sn < 0 || sn >= MAX_SKILL || skill_table[sn]->spell_fun == 0 ) { bug( "Do_research: bad sn %d.", sn ); return; } if ( !can_use_skill(ch, number_percent(), gsn_research ) ) /* see if player suceeds */ { set_char_color ( AT_MAGIC, ch ); send_to_char("You cannot glean any knowledge from it.\n\r", ch); learn_from_failure( ch, gsn_research ); act( AT_PLAIN, "$p burns brightly and is gone.", ch, obj, NULL, TO_CHAR ); act( AT_MAGIC, "$n accidently destroys a $p!", ch, obj, NULL, TO_NOTVICT); separate_obj( obj ); extract_obj( obj ); return; } if ( ch->pcdata->learned[sn]) { send_to_char("You already know that spell!\n\r",ch); return; } ch->pcdata->learned[sn] = 1; act(AT_PLAIN, "You have learned the art of $t!", ch,skill_table[sn]->name,NULL,TO_CHAR); act( AT_PLAIN, "$p burns brightly and is gone.", ch, obj, NULL, TO_CHAR ); separate_obj( obj ); extract_obj( obj ); return; } if (obj->item_type == ITEM_WAND) { sn = obj->value[3]; if ( sn < 0 || sn >= MAX_SKILL || skill_table[sn]->spell_fun == 0 ) { bug( "Do_research: bad sn %d.", sn ); return; } if ( !can_use_skill(ch, number_percent(), gsn_research ) ) { set_char_color ( AT_MAGIC, ch ); send_to_char("You cannot glean any knowledge from it.\n\r", ch); learn_from_failure( ch, gsn_research ); act( AT_PLAIN, "$p burns brightly and is gone.", ch, obj, NULL, TO_CHAR ); act( AT_MAGIC, "$n accidently destroys a $p!", ch, obj, NULL, TO_NOTVICT); separate_obj( obj ); extract_obj( obj ); return; } if ( ch->pcdata->learned[sn]) { send_to_char("You already know that spell!\n\r",ch); return; } ch->pcdata->learned[sn] = 1; act(AT_PLAIN, "You have learned the art of $t!", ch,skill_table[sn]->name,NULL,TO_CHAR); act( AT_PLAIN, "$p burns brightly and is gone.", ch, obj, NULL, TO_CHAR ); separate_obj( obj ); extract_obj( obj ); return; } if (obj->item_type == ITEM_SCROLL) { sn = obj->value[1]; if ( sn < 0 || sn >= MAX_SKILL || skill_table[sn]->spell_fun == 0 ) { bug( "Do_research: bad sn %d.", sn ); return; } if ( !can_use_skill(ch, number_percent(), gsn_research ) ) { set_char_color ( AT_MAGIC, ch ); send_to_char("You cannot glean any knowledge from it.\n\r", ch); learn_from_failure( ch, gsn_research ); act( AT_PLAIN, "$p burns brightly and is gone.", ch, obj, NULL, TO_CHAR ); act( AT_MAGIC, "$n accidently destroys a $p!", ch, obj, NULL, TO_NOTVICT); separate_obj( obj ); extract_obj( obj ); return; } if ( ch->pcdata->learned[sn]) { send_to_char("You already know that spell!\n\r",ch); return; } ch->pcdata->learned[sn] = 1; act(AT_PLAIN, "You have learned the art of $t!", ch,skill_table[sn]->name,NULL,TO_CHAR); act( AT_PLAIN, "$p burns brightly and is gone.", ch, obj, NULL, TO_CHAR ); separate_obj( obj ); extract_obj( obj ); return; } }