inherit NPC_OBJ; #include <config.h> #include <move_failures.h> void check_env(); void zap_cabbage(); string long_desc(); int eaten; string owned; object my_owner; void setup() { set_name("cabbage"); set_long( "A small cute looking cabbage.\n" ); basic_setup("cabbage", 1, 0 ); add_respond_to_with( ({ ({ "@hug", "@snuggle", "@cuddle", "@nestle", }), query_name() }), "#respond_nice"); add_respond_to_with( ({ ({ "@skick", "@spunch", "@sburn", "@jump", }), query_name() }), "#respond_nasty"); } /* setup() */ void set_owner( object thing ) { if (!objectp( thing ) ) return; set_long( (: long_desc :) ); owned = thing->query_name(); my_owner = thing; load_chat(30, ({ 1, "@roll up", 1, "@purr", 1, ":$V$0=ruffles its,ruffle their$V$ fronds.", 1, ":$V$0=looks,look$V$ green.", 1, "@snuggle " + owned, 1, "@stare dre at " + owned, 1, "@nestle " + owned, 1, "@roll over" }) ); check_env(); } /* set_owner() */ string long_desc() { if ( my_owner && environment( my_owner ) == environment() ) { return "This small, cute-looking cabbage stares adoringly at " + my_owner->one_short() + ".\n"; } return "This small, cute-looking cabbage is looking off into the " "distance. It is obviously hopelessly lost.\n"; } /* long_desc() */ void respond_nice( object souler ) { if ( my_owner && souler == my_owner) { init_command("nestle "+ file_name( souler ) ); } else { init_command("peer curiously "+ file_name( souler ) ); } } /* respond_nice() */ void respond_nasty( object souler ) { if ( my_owner && souler == my_owner) { init_command("gasp"); init_command("cry", 2); } else { init_command( "sburn " + file_name( souler ) + " dream"); } } /* respond_nasty() */ void init() { ::init(); this_player()->add_command("eat", this_object(), "<direct:object'cabbage'>" ); if ( owned && !my_owner ) { do_command( "cry" ); do_command( "'Woe is me! Where art thou, " + capitalize( owned ) + "?" ); call_out( (: zap_cabbage :), 1 ); return; } } /* init() */ int do_eat() { if ( this_player() != my_owner || eaten) { this_player()->add_failed_mess( this_object(), "You cannot eat this " "cabbage!\n" ); return -1; } this_player()->add_succeeded_mess( this_object(), ({ "The cabbage lovingly and " "adoringly purrs quietly as you viciously rip off its fronds and " "eat it. It dies looking wonderingly into your face.\n", "$N $V $D.\n" }) ); call_out( (: zap_cabbage :), 2 ); return 1; } /* do_eat() */ void zap_cabbage() { if ( environment() ) { all_inventory()->move( environment() ); } if ( my_owner ) { do_command( "unfollow " + file_name( my_owner ) ); } eaten = 1; my_owner = 0; owned = 0; move( "/room/rubbish" ); } /* zap_cabbage() */ int attack_by(object ob) { ob->stop_fight(this_object()); tell_object(ob, "The cabbage is a terrible pacifist.\n"); } /* attack_by() */ int attack_ob(object ob) { ob->stop_fight(this_object()); tell_object(ob, "The cabbage is a terrible pacifist.\n"); } /* attack_by() */ int adjust_hp(int number, object attacker) { return 0; } /* adjust_hp() */ void event_exit(object ob, string mess, object to) { call_out( (: check_env :), 10 ); ::event_exit( ob, mess, to); } /* event_exit() */ void event_dest_me(object ob) { call_out( (: check_env :), 1 ); } /* check_env() */ void check_env() { object my_env, owner_env, *caterpillars; if ( !owned ) return; my_env = environment(); if ( !my_env ) { return; } if ( !my_owner ) { do_command( "cry" ); zap_cabbage(); return; } owner_env = environment( my_owner ); if ( !owner_env ) { return; } if ( file_name( my_env ) == "/room/rubbish" ) { return; } if ( this_object()->query_property( "dead" ) ) { return; } if (my_env == my_owner) { return ; } if (owner_env == my_env) { return ; } if (owner_env->query_mirror_room() == my_env) { return ; } caterpillars = match_objects_for_existence( "caterpillar", ({ owner_env }) ); if ( my_env != owner_env && !sizeof(caterpillars)) { move( owner_env, "$N appear$s with a squelch.", "$N disappear$s with a squelch." ); do_command( "follow " + file_name( my_owner ) ); } } /* check_env() */ object query_owner() { return my_owner; } /* query_owner() */ /* * On Cabbage Day, we need to be moved out of a player's inventory. */ int query_theft_command() { return -1; } /* query_theft_command() */ int move(object dest, string mess1, string mess2) { int ret; ret = ::move(dest, mess1, mess2); if (ret == MOVE_OK) { call_out((: check_env :), 10); } return ret; } /* move() */