/* -*- LPC -*- */ /* * $Locker: $ * $Id: scroll_base.c,v 1.4 2000/06/28 05:09:39 pinkfish Exp $ * $Log: scroll_base.c,v $ * Revision 1.4 2000/06/28 05:09:39 pinkfish * Fix up the scroll base to work with the new spells. * * Revision 1.3 1999/12/01 06:19:53 pinkfish * Fix up some bugs. * * Revision 1.2 1999/11/08 22:39:49 pinkfish * Move the reaction code into a seperate file. * * Revision 1.1 1999/11/04 01:51:34 pinkfish * Initial revision * * */ /** * This is the basic control file for scrolls. It contains all the common * scroll handling stuff that goes into both the object and the shadow. */ #include <tasks.h> inherit "/std/basic/scroll_book_react"; #define SKILL "magic.items.scroll" #define CONTROL_SKILL "magic.spells.special" private string _spell; /** @ignore yes */ string long( string word, int dark ) { int i; int j; int chance; int level; int width; string spell_name; level = 2 * (int)_spell->query_power_level(); width = sqrt( level ); chance = (int)this_player()->query_skill_bonus( SKILL ) - ( level - width ); chance = ( 100 * chance ) / ( 2 * width + 1 ); spell_name = "$"+ (string)_spell->query_name() +"$"; j = strlen( spell_name ) - 1; for ( i = 1; i < j; i++ ) { if ( random( 100 ) > chance ) { switch ( spell_name[ i ] ) { case 32 : break; case 65 .. 90 : spell_name = spell_name[ 0 .. i - 1 ] + sprintf( "%c", 65 + random( 26 ) ) + spell_name[ i + 1 .. j ]; break; case 97 .. 122 : spell_name = spell_name[ 0 .. i - 1 ] + sprintf( "%c", 97 + random( 26 ) ) + spell_name[ i + 1 .. j ]; break; default : spell_name = spell_name[ 0 .. i - 1 ] + spell_name[ i + 1 .. j ]; j--; } } } spell_name = spell_name[ 1 .. j - 1 ]; return spell_name; } /* long() */ /** * This method returns always returns 1 for a magic scroll. * @return always returns 1 */ int query_magic_scroll() { return 1; } /** * This method returns the current binding force of the scroll. This is * the amount of force the paper exerts to try and keep the spell on the * paper. * @return the scrolls binding force */ int query_binding_force() { return 5; } /** * This method returns the spell associated with the scroll. * @return the spell associated with the scroll */ string query_spell() { return _spell; } /** * This method returns the power level of the spell current associated * with the object. */ int query_spell_power_level() { if (_spell) { return _spell->query_power_level(); } } /* query_spell_power_level() */ /** * This method sets the spell associated with the scroll. * @param word the spells path */ void set_spell( string word ) { _spell = word; } /** * This method returns the name o fthe spell on the scroll. * @return the name of the spell */ string query_spell_name() { return (string)_spell->query_name(); } /** * This method tests the skill needed to cast the spell on the scroll. * @return the skill needed to cast */ int test_skill() { int level; level = 2 * (int)( _spell->query_power_level() ) + 1; return (int)TASKER->perform_task(this_player(), SKILL, level, TM_FREE); } /* test_spell() */ /** * This method clears the spell off the scroll and turns it back into * a normal piece of paper. * @param award a tm was awarded on the way */ void clear_spell( int award ) { if ( award ) { write( "%^YELLOW%^"+ ({ "A piece of lore concerning scrolls becomes " "clearer for you", "You manage to grasp one of the principles " "of magic scrolls more firmly", "A sudden flash of insight " "allows you to understand process of casting a spell from a " "scroll a little better" })[ random( 3 ) ] +".%^RESET%^\n" ); } } /* clear_spell() */ /** * This method clears the spell off the scroll and turns it back into * a normal piece of paper. * @param award a tm was awarded on the way */ int cast_spell( string words ) { int outcome; if ( !words ) { words = ""; } outcome = test_skill(); if ( outcome == FAIL ) { return notify_fail( "You can't figure out how to use the scroll.\n" ); } if ( !( _spell->cast_spell( words, 1 ) ) ) { return 0; } clear_spell( outcome == AWARD ); return 1; } /* cast_spell() */ /** * This method clears the spell off the scroll and turns it back into * a normal piece of paper. * @param award a tm was awarded on the way */ int cast_spell_new( string words , object* targets, object* using ) { int outcome; if ( !words ) { words = ""; } outcome = test_skill(); if ( outcome == FAIL ) { return notify_fail( "You can't figure out how to use the scroll.\n" ); } if ( !( _spell->cast_spell_new( words, 1, targets, using ) ) ) { return 0; } clear_spell( outcome == AWARD ); return 1; } /* cast_spell() */ /** @ignore yes */ string query_death_reason() { return " a spell going wild and getting out of control."; } /* query_death_reason() */