/* -*- LPC -*- */ /* * $Locker: $ * $Id: fungus.c,v 1.7 2001/09/24 21:56:19 danbala Exp $ */ #include <move_failures.h> inherit "/obj/food"; int delay, large_weight, stage; string adjs, extra, type, *messages; void next_stage(); void create() { do_setup++; ::create(); do_setup--; set_name( "fungus" ); add_plural( "fungi" ); set_short( "fungus" ); delay = 600; large_weight = 4; set_weight_per_bite( 1 ); extra = "It looks edible."; type = "mushroom"; messages = ({ "A small $type$ pushes up through the soil.\n", "The $type$ seems to be a bit larger now.\n", "The $type$ looks nice and large now.\n", "The $type$ silently releases a grey dust into the air.\n", "The $type$ collapses in on itself and falls apart.\n" }); if ( !do_setup ) this_object()->setup(); if ( clonep( this_object() ) ) call_out( "next_stage", delay / 2 + random( delay ) ); } /* create() */ int query_growing() { return 1; } int query_delay() { return delay; } void set_delay( int number ) { if ( number < 60 ) number = 60; delay = number; if ( remove_call_out( "next_stage" ) > -1 ) call_out( "next_stage", delay / 2 + random( delay ) ); } /* set_delay() */ int query_large_weight() { return large_weight; } int query_stage() { return stage; } void set_stage( int number ) { if(number > 0) { stage = number - 1; } this_object()->next_stage(); } void set_large_weight( int number ) { large_weight = number; } string query_adjs() { return adjs; } void set_adjs( string words ) { adjs = words; } string query_extra() { return extra; } void set_extra( string words ) { extra = words; } string query_type() { return type; } void set_type( string word ) { type = word; } string *query_messages() { return messages; } void set_messages( string *words ) { if ( sizeof( words ) != 5 ) { write( "WARNING: there must be five messages.\n" ); return; } messages = words; } /* set_messages() */ void init() { ::init(); if ( stage > 5 ) this_player()->add_command( "pick", this_object() ); } /* init() */ int test_non_spore( object thing ) { return ( (int)thing->query_stage() > 5 ); } /* test_non_spore() */ void setup_spore() { set_name("pile"); set_short("small, dusty pile of fungus spores"); add_alias("dust"); add_alias("spore"); add_adjective("fungus"); add_adjective("spore"); set_main_plural("small, dusty piles of fungus spores"); add_plural(({"piles","spores"})); add_plural_adjective("small, dusty piles of"); add_plural_adjective("fungus"); set_delay( delay ); set_large_weight( large_weight ); set_weight_per_bite( query_weight_per_bite() ); set_adjs( adjs ); set_extra( extra ); set_long("This is a small pile of dust, mainly fungus " "spores, it seems.\n"); set_type( type ); set_messages( messages ); } object make_spore( object place ) { object spore; spore = clone_object( explode( file_name( this_object() ), "#" )[0]); spore->setup_spore(); spore->move( place ); return spore; } /* make_spore() */ void next_stage() { int i, number; string words; object *things; if ( !environment() ) return; if ( adjs ) words = adjs +" "+ type; else words = type; switch ( stage ) { case 0 .. 4 : /* dormant spore */ this_object()->setup_spore(); break; case 5 : /* small */ things = match_objects_for_existence( pluralize(words), ({ environment() }) ); things = filter_array( things, "test_non_spore", this_object() ); if ( sizeof( things ) >= (int)environment()->query_property( words +" capacity" ) ) { move( "/room/rubbish" ); return; } tell_room( environment(), replace( messages[ 0 ], "$type$", words ) ); set_aliases( ({ type }) ); set_plurals( ({ "fungi", pluralize( type ) }) ); set_short( "small "+ words ); if ( adjs ) set_adjectives( ({ "small" }) + explode( adjs, " " ) ); else set_adjectives( ({ "small" }) ); set_main_plural( "small "+ pluralize( words ) ); set_long( "This is a small "+ words +"."+ ( extra ? " "+ extra : "" ) + "\n" ); set_weight( large_weight / 4 ); things = all_inventory( environment() ); for ( i = 0; i < sizeof( things ); i++ ) if ( living( things[ i ] ) ) things[ i ]->add_command( "pick", this_object() ); break; case 6 : /* medium */ tell_room( environment(), replace( messages[ 1 ], "$type$", words ) ); set_short( "medium "+ words ); if ( adjs ) set_adjectives( ({ "medium" }) + explode( adjs, " " ) ); else set_adjectives( ({ "medium" }) ); set_main_plural( "medium "+ pluralize( words ) ); set_long( "This is a medium sized "+ words +"."+ ( extra ? " "+ extra : "" ) +"\n" ); set_weight( large_weight / 2 ); break; case 7 : /* large */ tell_room( environment(), replace( messages[ 2 ], "$type$", words ) ); set_short( "large "+ words ); if ( adjs ) set_adjectives( ({ "large" }) + explode( adjs, " " ) ); else set_adjectives( ({ "large" }) ); set_main_plural( "large "+ pluralize( words ) ); set_long( "This is a large "+ words +"."+ ( extra ? " "+ extra : "" ) + "\n" ); set_weight( large_weight ); break; case 8 .. 10 : /* spore production */ break; case 11 : /* spore release */ if(!environment() || base_name(environment()) == "/room/rubbish") break; tell_room( environment(), replace( messages[ 3 ], "$type$", words ) ); number = 2 + random( 3 ); for ( i = 0; i < number; i++ ) make_spore( environment() ); break; default : /* death */ tell_room( environment(), replace( messages[ 4 ], "$type$", words ) ); move( "/room/rubbish" ); return; } stage++; call_out( "next_stage", delay / 2 + random( delay ) ); } /* next_stage() */ int do_get() { if ( stage != -1 ) { write( the_short() +" is currently growing. You could \"pick\" "+ "it, though.\n" ); return 0; } if ( move( this_player() ) == MOVE_OK ) return 1; return 0; } /* do_get() */ int do_take() { return do_get(); } int do_pick() { if ( stage < 6 ) return 0; stage = -1; remove_call_out( "next_stage" ); if ( move( this_player() ) != MOVE_OK ) call_out( "too_heavy_mess", 0, this_player() ); return 1; } /* do_pick() */ void too_heavy_mess( object thing ) { if ( thing ) tell_object( thing, "You are carrying too much to lift the "+ type + " as well, so you leave it on the ground.\n" ); } /* too_heavy_mess() */ string query_medium_short() { if ( adjs ) return adjs +" "+ type; return type; } /* query_medium_short() */ mapping query_static_auto_load() { return int_query_static_auto_load(); } void init_dynamic_arg( mapping args, object) { ::init_dynamic_arg( args ); stage = -1; remove_call_out( "next_stage" ); } /* init_dynamic_arg() */