/** * This is an inherit for flowers, it has some decay functionality * built in, plus adding custom smell messages/functions/effects * will be easy. * @author Sandoz, 2001. */ #include <bit.h> #define BRAID_EFFECT EFFECTS_DIR "/other/braided_effect" inherit OBJECT_OBJ; mixed smell_mess; mixed smell_func; string smell_eff; string withered_long; int decay; int do_braid( object *obs ); /** @ignore yes */ void create() { decay = 1000; ::create(); add_alias("flower"); add_plural("flowers"); add_extra_look(TO); BIT_CONTROLLER->add_bit(TO); } /* create() */ /** * This method sets the maximum decay time for the flower. * @param i the decay time to set */ void set_decay( int i ) { decay = i; } /** @ignore yes */ int query_flower() { return 1; } /** * This method returns the withered long of the flower. * @return the withered long description */ string query_withered_long() { return withered_long; } /** * This method will set the long description to use when * the flower has withered. * @param str the long desc to use for the withered state */ void set_withered_long( string str ) { withered_long = str; } /** * This method returns the smell message set for the flower. * @return the smell message(s) */ mixed query_smell_message() { return smell_mess; } /** * This method sets the smell message(s) for the flower. * @param mess the message can be either a string or array, using an * add_succeeded_mess pattern. */ void set_smell_message( mixed mess ) { if( pointerp( mess ) ) { if( sizeof( mess ) != 2 ) write( "Smell message must be either a string or an array of " "two elements.\n" ); else smell_mess = mess; return; } if( stringp( mess ) ) smell_mess = mess; } /* set_smell_message() */ /** * This method returns the smell effect set for the flower. * @return the smell effect */ string query_smell_effect() { return smell_eff; } /** * This method sets the smell effect for the flower. * @param eff the effect to use when the flower is being smelled. */ void set_smell_effect( string eff ) { smell_eff = eff; } /** * This method returns the smell function set for the flower. * @return the smell function */ mixed query_smell_func() { return smell_func; } /** * This method sets the smell function for the flower. * This function will be called with the player doing * the smelling as an argument. * @param func the function to call when the flower is being * smelled - it can be either a string, in which case it will * be called on the flower object, or an array where the first * member would be the filename of the object to call the * function on, while the second member will be the function * to call. */ void set_smell_function( mixed func ) { if( pointerp( func ) ) { if( sizeof( func ) != 2 ) write("Smell function must be either a string or an array of " "two elements.\n"); else smell_func = func; return; } if( stringp( func ) ) smell_func = func; } /* set_smell_function() */ /** @ignore yes */ string short( int dark ) { return ( !decay && !query_property("just withered") ? "withered " : "" ) + ::short( dark ); } /* short() */ /** @ignore yes */ string long( string word, int dark ) { if( !decay ) return ( withered_long ? withered_long : ::long() + "It is completely withered.\n" ); return ::long( word, dark ); } /* long() */ /** @ignore yes */ void do_decay() { int rate; object cont, env; if( !cont = ENV(TO) ) { BIT_CONTROLLER->remove_bit(TO); return; } if( ( rate = 5 + (int)cont->query_property( "decay rate" ) ) > 0 ) decay -= rate; if( decay <= 0 ) { decay = 0; BIT_CONTROLLER->remove_bit(TO); add_adjective("withered"); add_property("just withered", 1, 2 ); if( !ENV(cont) ) { tell_room( cont, one_short()+" $V$0=withers,wither$V$.\n"); return; } if( living(cont) ) { tell_room( ENV(cont), poss_short()+" $V$0=withers,wither$V$.\n"); return; } if( !cont->query_vase() ) return; if( living( env = ENV(cont) ) ) env = ENV(env); tell_room( env, one_short()+" in "+cont->poss_short()+" " "$V$0=withers,wither$V$.\n"); } } /* do_decay() */ /** @ignore yes */ void init() { add_command("smell"); add_command("braid", "<indirect:living> hair with <direct:object:me>", (: do_braid( $1 ) :) ); } /* init() */ /** @ignore yes */ int do_braid( object *obs ) { object ob; if( sizeof(obs) > 1 ) { add_failed_mess("You can only $V one person's hair with $D.\n"); return 0; } ob = obs[0]; if( !living(ob) ) { add_failed_mess("$I is not living.\n"); return 0; } if( ob->query_cannot_braid() ) { add_failed_mess("It appears "+ob->poss_short()+" hair is already " "braided full of flowers.\n"); return 0; } ob->add_effect( BRAID_EFFECT, TO ); add_succeeded_mess("$N $V $D into "+( ob == TP ? "$p" : ob->poss_short() )+" hair.\n"); return 1; } /* do_braid() */ /** @ignore yes */ int do_smell() { if( !decay ) { add_failed_mess("$D $V$0=appears,appear$V$ to be completely withered " "and $V$0=doesn't,don't$V$ smell that much anymore.\n"); return 0; } if( smell_eff ) TP->add_effect( smell_eff ); if( smell_func ) { if( pointerp( smell_func ) ) call_other( smell_func[0], smell_func[1], TP ); else call_other( TO, smell_func, TP ); } add_succeeded_mess( ( !smell_mess ? "$N $V $D.\n" : smell_mess ) ); return 1; } /* do_smell() */ /** @ignore yes */ void dest_me() { BIT_CONTROLLER->remove_bit(TO); ::dest_me(); } /* dest_me() */ /** @ignore yes */ mapping query_dynamic_auto_load() { mapping m; if( !query_name() || query_name() == "object" ) return 0; m = ([ "::" : ::query_dynamic_auto_load() ]); if( decay ) m["decay"] = decay; return m; } /* query_dynamic_auto_load() */ /** @ignore yes */ void init_dynamic_arg( mapping m ) { if( m["::"] ) ::init_dynamic_arg( m["::"] ); decay = m["decay"]; if( !decay ) { add_adjective("withered"); BIT_CONTROLLER->remove_bit(TO); } } /* init_dynamic_arg() */ /** @ignore yes */ mapping int_query_static_auto_load() { mapping m; m = ([ "::" : ::int_query_static_auto_load() ]); if( withered_long ) m["withered long"] = withered_long; if( smell_mess ) m["smell mess"] = smell_mess; if( smell_eff ) m["smell eff"] = smell_eff; if( smell_func ) m["smell func"] = smell_func; return m; } /* int_query_static_auto_load() */ /** @ignore yes */ void init_static_arg( mapping m ) { if( !mappingp( m ) ) return; if( m["::"] ) ::init_static_arg( m["::"] ); if( m["withered long"] ) withered_long = m["withered long"]; if( m["smell mess"] ) smell_mess = m["smell mess"]; if( m["smell eff"] ) smell_eff = m["smell eff"]; if( m["smell func"] ) smell_func = m["smell func"]; } /* init_static_arg() */ /** @ignore yes */ mapping query_static_auto_load() { if( !query_name() || query_name() == "object" ) return 0; if( base_name(TO) + ".c" == __FILE__ ) return int_query_static_auto_load(); return 0; } /* query_static_auto_load() */ /** @ignore yes */ string extra_look() { if( !decay ) return ""; switch( decay / 10 ) { case 0..3: return "It is completely withered.\n"; break; case 4..20: return "It is fairly withered.\n"; break; case 21..50: return "It is somewhat withered.\n"; break; case 51..80: return "It has started to wither.\n"; break; default: return "It looks quite fresh.\n"; } } /* extra_look() */ /** @ignore yes */ mixed stats() { return ::stats() + ({ ({ "decay", decay }), }); } /* stats() */