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() */