/** * This is an egg inherit, which will make it possible for * eggs to have additional funcionality compared to regular * food objects. You can crack eggs into containers or throw * them at people. * @author Sandoz, 20, September 2001. */ #define AMOUNT_MOD 300 #define EGG_EFFECT EFFECTS_DIR "/other/covered_in_egg" inherit FOOD_OBJ; int cracked; string creature; void do_liquidate(); int do_throw( object *obs ); int do_crack( object *obs ); string query_size_string(); /** @ignore yes */ int query_egg_yolk() { return cracked; } /** * This method sets the race/type of creature the egg belongs to. * @param who the type of creature to set the egg to * @see query_creature */ void set_creature( string who ) { creature = who; set_short( creature+" egg" ); add_adjective( creature ); } /* set_creature() */ /** * This method returns the race/type of creature the egg belongs to. * @return the type of creature the egg belongs to * @see set_creature */ string query_creature() { return creature; } /** @ignore yes */ void create() { ::create(); set_name("egg"); set_long("This $size$, oval $creature$ egg would probably taste good " "if baked, or might come in handy otherwise. You could probably " "'crack' it into a bowl or similar, or just eat it as it is.\n"); if( cracked ) do_liquidate(); } /* create() */ /** @ignore yes */ string long( string words, int number ) { return replace( ::long( words, number ), ({ "$creature$", creature, "$size$", query_size_string() }) ); }/* long() */ /** @ignore yes */ string query_size_string() { switch( query_weight() ) { case 0..1: return "tiny"; case 2..4: return "small"; case 5..10: return "medium sized"; case 11..20: return "large"; case 21..40: return "huge"; default: return "enormous"; } } /* query_size_string() */ /** @ignore yes */ void set_weight( int i ) { set_weight_per_bite( i ); ::set_weight( i ); } /* set_weight() */ /** @ignore yes */ void do_liquidate() { set_determinate("some"); set_name("yolk"); add_alias("egg"); set_short( creature+" egg yolk"); set_long("This is some $creature$ egg yolk, $amount_size$.\n"); add_adjective( ({ creature+" egg", "some", "drop", "drops", "teaspoon", "teaspoons", "tablespoon", "tablespoons", "ounce", "ounces", "cup", "cups", "pint", "pints", "quart", "quarts", "gallon", "gallons", "of" }) ); set_liquid(); set_value_scale( 0.0001 ); set_medium_alias( CAP(creature)+"EggYolk"); set_amount( AMOUNT_MOD * query_weight() ); set_weight_unit( ({ 1, AMOUNT_MOD }) ); set_pile_types( ({ 50, "small", 100, "medium", "large" }) ); set_amount_types( ([ "drop": ({ 1, "drops" }), "teaspoon": ({ 20, "teaspoons" }), "tablespoon": ({ 60, "tablespoons" }), "ounce": ({ 120, "ounces" }), "cup": ({ 960, "cups" }), "pint": ({ 2400, "pints" }), "quart": ({ 4800, "quarts" }), "gallon": ({ 19200, "gallons" }) ]) ); } /* do_liquidate() */ /** @ignore yes */ void init() { ::init(); if( !cracked ) { add_command("throw", "<direct:object:me> [at] <indirect:living:here>", (: do_throw( $1 ) :) ); add_command("crack", "<direct:object:me> [into] <indirect:object:me'vessel'>", (: do_crack( $1 ) :) ); } } /* init() */ /** @ignore yes */ int do_throw( object *obs ) { if( sizeof(obs) > 1 ) { add_failed_mess("You can only $V $D at one target.\n"); return 0; } move("/room/rubbish"); call_out( (: $1[0]->add_effect( EGG_EFFECT, ({ 240 + roll_MdN( sqrt(query_weight()), 120 ), TO }) ) :), 0, obs ); add_succeeded_mess( "$N $V $D at $I.\n", obs ); return 1; } /* do_throw() */ /** @ignore yes */ int do_crack( object *obs ) { object ob; int space; if( cracked ) { add_failed_mess("How do you expect to $V a mass of egg " "yolk and albumen?\n"); return 0; } if( sizeof(obs) > 1 ) { add_failed_mess("You can only $V $D into one vessel.\n"); return 0; } ob = obs[0]; if( !ob->query_max_volume() ) { add_failed_mess("You can only $V $D into a vessel.\n"); return 0; } if( ( space = ob->query_volume_left() ) < 1 ) { add_failed_mess( "You can't $V $D into $I, because it is " "completely full.\n", obs ); return 0; } if( ( space - AMOUNT_MOD * query_weight() ) < 1 ) { add_failed_mess("You don't think all of $D would fit into $I.\n", obs ); return 0; } if( !ob->test_add(TO) ) { add_failed_mess("You can't $V $D into $I.\n", obs ); return 0; } cracked = 1; /* use call_outs so the short desc wouldn't change before the move */ call_out( "do_liquidate", 0 ); call_out( (: move($1) :), 1, ob ); add_succeeded_mess("$N $V open $D and poor$s the contents into $I.\n", obs ); return 1; } /* do_crack() */ /** @ignore yes */ int do_eat() { if( cracked ) { add_failed_mess("You cannot $V $D.\n"); return 0; } add_succeeded_mess(({ "You crack open $D, suck out and swallow all of " "the slightly salty yolk and albumen and lick clean your fingers.\n", "$N crack$s open $D, suck$s out all of the yolk and albumen and " "lick$s clean $p fingers.\n" }) ); move("/room/rubbish"); consume( TP, 0 ); return 1; } /* do_eat() */ /** @ignore yes */ int do_cut( int i ) { add_failed_mess("You cannot $V $D.\n"); return 0; } /* do_cut() */ /** @ignore yes */ int do_mince() { add_failed_mess("You cannot $V $D.\n"); return 0; } /* do_mince() */ /** @ignore yes */ mapping query_dynamic_auto_load() { mapping map; if( !query_name() || query_name() == "object" ) return 0; map = ([ "::" : ::query_dynamic_auto_load() ]); if( cracked ) map["cracked"] = cracked; return map; } /* query_dynamic_auto_load() */ /** @ignore yes */ void init_dynamic_arg( mapping map ) { if( map["::"] ) ::init_dynamic_arg( map["::"] ); if( map["cracked"] ) cracked = map["cracked"]; } /* init_dynamic_arg() */ /** @ignore yes */ mapping int_query_static_auto_load() { mapping map; map = ([ "::" : ::int_query_static_auto_load() ]); if( creature ) map["creature"] = creature; return map; } /* int_query_static_auto_load() */ /** @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 */ void init_static_arg( mapping map ) { if( !mappingp( map ) ) return; if( map["::"] ) ::init_static_arg( map["::"] ); if( map["creature"] ) creature = map["creature"]; } /* init_static_arg() */ /** @ignore yes */ mixed *stats() { return ::stats() + ({ ({ "creature", creature }), ({ "cracked", cracked }) }); } /* stats() */