/* use <thing> to cast <ritual> [on <target>]
* coded by Olorin
*/
#include <tasks.h>
#include <rituals.h>
#include <move_failures.h>
#include "path.h"
#define SKILL "faith.items.scroll"
#define DROPOFF 40
#define RITUAL_NAME arg()[ 0 ]
#define RITUAL arg()[ 1 ]
#define BONUS_STORED arg()[ 2 ]
#define COST ( RITUAL->query_point_cost() / 2 )
#define CONSUME_CHANCE 50
inherit "/std/effect_shadow";
int disabled = 0;
int do_use( object *, string, string, mixed *, string );
void init() {
int directed;
directed = RITUAL->query_directed();
if ( directed & NOTARGET )
this_player()->add_command( "use", player,
"<direct:object:here-me> to cast "+
RITUAL_NAME );
if ( directed & NONLIVING )
this_player()->add_command( "use", player,
"<direct:object:here-me> to cast "+
RITUAL_NAME +" [on|at] <indirect:object>");
else if ( directed & LIVING || directed & SELF)
/* only needs special treatment
* if not also non-living
*/
this_player()->add_command( "use", player,
"<direct:object:here-me> to cast "+
RITUAL_NAME +" [on|at] <indirect:living>");
player->init();
} /* init() */
string query_ritual_name() {
return RITUAL_NAME;
} /* query_ritual_name() */
int query_imbued() {
return 1;
} /* query_imbued() */
mixed query_arg() {
return arg();
} /* query_arg() */
mixed query_player() {
return player;
} /* query_player() */
int do_use( object *targets, string dir_match,
string indir_match, mixed *args, string pattern ) {
object caster, place;
string thing, ritual, target;
int diff, explode;
if ( disabled )
return 0;
/* if ( creatorp(this_player()) )
tell_object( this_player(),
sprintf( "$I$2=do_use called:\nindir=%O\n"
"dir_match=%O\nindir_match=%O\nargs=%O\n"
"pattern=%O$I$0=\n",
targets, dir_match,
indir_match, args, pattern ) );
*/
caster = this_player();
if ( !(targets = RITUAL->check_target( caster, targets ) ) ) {
this_player()->add_failed_mess( player, "", ({ }) );
return 0;
}
if ( (int)caster->query_specific_gp( "faith" ) < COST ) {
this_player()->add_failed_mess( player, "You do not have enough guild "
"points to use $D to cast " + RITUAL_NAME
+"; it will cost you "+ COST
+".\n", ({ }) );
return 0;
}
// there's a chance the item will be destroyed in the casting.
// the chance is dependant on the difference between the power of the
// ritual and the value of the item.
diff = player->query_value() -
(RITUAL->query_power_level() * RITUAL->query_power_level());
// This gives us a non-linear (x2?) relationship.
if(diff < 1 || random(random(diff)) < CONSUME_CHANCE) {
explode = 1;
} else {
explode = 0;
}
switch ( (int)TASKER->perform_task(caster, SKILL,
RITUAL->query_power_level(),
TM_RITUAL)) {
case AWARD :
if(explode)
caster->add_skill_level( SKILL, -1 );
else
tell_object( caster,
({ "%^YELLOW%^You manage to grasp one of the principles "
"behind using religious items more firmly.%^RESET%^\n",
"%^YELLOW%^You feel better at using religious "
"items.%^RESET%^\n",
"%^YELLOW%^You seem to be a step closer to mastering the "
"use of religious items.%^RESET%^\n" })[ random( 3 ) ]
);
case SUCCEED :
if(explode) {
tell_object(caster, "Trying to cast " + RITUAL_NAME + " consumes " +
player->the_short()+ " and it crumbles to dust.\n");
this_player()->add_succeeded( targets );
this_player()->add_succeeded_mess( player, "", ({ }) );
if(player->move("/room/rubbish") != MOVE_OK) {
player->dest_me();
}
return 1;
}
if ( RITUAL->item_spell( caster, targets, "", BONUS_STORED ) ) {
caster->adjust_gp( - COST );
tell_object( caster, "You use "+ (string)player->the_short()
+" to cast "+ RITUAL_NAME +".\n" );
call_out( "remove_this_effect", 0 );
disabled = 1;
}
break;
default :
if (!random(2)) {
tell_object( caster, "You fail to use "+ (string)player->the_short()+
" to cast "+ RITUAL_NAME +" and it crumbles to dust.\n" );
if(player->move("/room/rubbish") != MOVE_OK) {
player->dest_me();
}
return 1;
}
tell_object( caster, "You fail to use "+ (string)player->the_short()
+" to cast "+ RITUAL_NAME +".\n" );
}
this_player()->add_succeeded( targets );
this_player()->add_succeeded_mess( player, "", ({ }) );
return 1;
} /* do_use */
mixed stats() {
return ({
({ "ritual name", RITUAL_NAME }),
({ "ritual object", RITUAL }),
({ "stored bonus", BONUS_STORED }),
}) + player->stats();
} /* stats() */