/* A Paladin's Steed * This object is present as a kind of follower for a paladin of * reasonable level. It can be mounted, and when this is done, * the steed is destructed and the paladin's short/long/etc is * shadowed to make it look like he is riding it. */ #define STEED "obj/shadows/p_steed" #define FOLLOW "obj/shadows/follow" #define NAME (string)this_player()->query_name() #include <mudlib.h> string owner; object follow; void check_for_owner(); inherit MONSTER; void reset(status arg) { ::reset(arg); if(arg) return; set_short("A fine steed"); set_alias("horse"); set_name("warhorse"); set_long("A fine heavy warhorse of excelent quality and breeding.\n"); set_level(10); set_race("horse"); /* other stats are taken care of themselves */ set_al(100); set_msgin("gallops in"); set_msgout("gallops out"); set_gender(2); set_dead_ob(this_object()); load_chat(2,({ "Warhorse neighs.\n", "Warhorse looks around.\n", })); load_a_chat(5,({ "Warhorse kicks hard.\n", "Warhorse neighs.\n", })); set_attack_msg(({ "bites", "gently", "grazes", "softly", "kicks", "lightly", "bites", "meanacingly", "kicks", "with a crushing blow", "bites viciously", "with fervour", "kicks powerfully", "with its rear legs", })); move_object(clone_object("obj/soul"),this_object()); } void monster_died(object obj) { if(owner == (string)this_player()->query_name()) { tell_object(this_player(), "Such an act is looked down upon by the gods.\n"+ "Lightning strikes you from the heavens!\n"); this_player()->death(); /* yes...that bad! */ } } void init() { add_action("horse_mount", "mount"); /* taken from the charm_ob.c funs ...paladin doesnt need to persuade it */ add_action("horse_commands", query_name(1)); add_action("horse_commands", query_name()); check_for_owner(); ::init(); } void check_for_owner() { if(!present(owner, environment())) destruct(this_object()); } status horse_commands(string str, status forced) { string arg; object ob, *obj; int i; if(!forced && (string)this_player()->query_name() != owner) return 0; if(!str) { notify_fail(query_name(1) +" what?\n"); return 0; } sscanf(str, "%s %s", str, arg); switch(str) { case "kill": if(!arg) { write(this_object()->query_name() +" looks aggressive.\n"); say(this_object()->query_name() +" puffs up and looks aggressive.\n"); } else if(!(ob = present(arg, environment(this_player())))) { write(this_object()->query_name() +" looks behind you and doesn't "+ "see "+ arg +".\n"); say(this_object()->query_name() +" starts looking for "+ arg +".\n"); } else if(!living(ob)) { tell_room(environment(this_player()),this_object()->query_name()+ " picks up the "+arg+" gives it a shake, then drops it.\n"); } else if(this_object()->query_secondary_attacker(ob)) { write(this_object()->query_name()+ " gives an extra aggressive attack.\n"); } else { tell_room(environment(this_player()), this_object()->query_name()+" leaps upon "+ arg +".\n"); this_player()->add_secondary_attacker(ob); this_object()->add_secondary_attacker(ob); } break; case "get": if(!arg) { tell_room(environment(this_player()), this_object()->query_name() +" drops to the ground.\n"); } if(arg == "all") { obj = all_inventory(environment()); for(i=0; i<sizeof(obj); i++) { if(obj[i]->short()) horse_commands("get "+obj[i]->query_name(), 1); } } else if((ob = present(arg, environment(this_object())))) { if(ob->get()) { tell_room(environment(this_player()), this_object()->query_name() +" gets the "+ arg +".\n"); move_object(ob, this_object()); this_object()->add_weight((int)ob->query_weight()); } else { write(this_object()->query_name() +" trys but can't get it.\n"); } } else { tell_room(environment(this_object()),this_object()->query_name() + " looks around for the "+arg+".\n"); } break; case "drop": if(!arg) { tell_room(environment(this_player()), this_object()->query_name() +" drops to the ground.\n"); } if(arg == "all") { obj = all_inventory(environment()); for(i=0; i<sizeof(obj); i++) { if(obj[i]->short()) horse_commands("drop "+obj[i]->query_name(), 1); } } else if(ob = (present(arg, this_object()))) { if(!ob->drop()) { tell_room(environment(this_player()), this_object()->query_name()+" drops the "+ arg +".\n"); move_object(ob, environment(this_object())); this_object()->add_weight((int)ob->query_weight()*(-1)); } else { write(this_object()->query_name() +" refuses to drop it.\n"); } } else { tell_room(environment(this_object()), this_object()->query_name() +" looks around for the "+ arg +".\n"); } break; case "follow": follow = clone_object(FOLLOW); follow->follow(this_player(), this_object()); write(this_object()->query_name() +" waits for you to leave.\n"); say(this_object()->query_name() +" watches "+ NAME +" closely.\n", this_player()); break; case "stay": if(!follow) { write(this_object()->query_name() +" is not following you.\n"); } else { destruct(follow); tell_room(environment(this_player()), this_object()->query_name() +" gives up the chase.\n"); } break; case "wear": write(this_object()->query_name()+" can't wear anything!\n"); break; case "wield": write(this_object()->query_name()+" can't wield anything!\n"); break; case "leave": say(this_object()->query_name()+" gallops off into the distance.\n"); destruct(this_object()); break; default: if(!command(str +" "+ arg, this_object())) { write(this_object()->query_name() +" looks at you in a confused mannor.\n"); say(this_object()->query_name() + " looks at "+ NAME +" in a confused mannor.\n", this_player()); } break; } return 1; } string set_owner(string str) { return owner = str; } status horse_mount() { int i; object *obj; if(owner != (string)this_player()->query_name()) { write(this_object()->query_name()+" wearily moves away from you.\n"); say(this_object()->query_name()+" wearily moves away from "+ this_player()->query_name()+".\n", this_player()); return 1; } if(first_inventory(this_object()) && !first_inventory(this_object())->id("soul")) { write(this_object()->query_name()+" can't carry you as well as all "+ "these items.\n"); obj = all_inventory(this_object()); for(i=0; i<sizeof(obj); i++) { if(obj[i]->short()) say(this_object()->query_name()+" drops "+obj[i]->query_name()+"\n"); } } write("You mount your steed.\n"); say(this_player()->query_name()+" mounts "+this_player()->query_possessive() +" steed.\n", this_player()); clone_object(STEED)->shadow_horse(); destruct(this_object()); return 1; }