// henchman.c - Radix, June 1996 /* Added settable protect and follow functions * rewrote check_for_owner to incorporate * query_no_clean_up so instead of leaving players helpless w/o * henchman after a reset the room just doesnt dest if the henchman is * there and the player is logged in but somewhere else. * the only time house_clean should EVER get called is if there is an * error. * Raskolnikov Oct 96 */ inherit "/obj/monster.c"; object owner; string join_room_mess; string join_me_mess; string leave_room_mess; mixed my_data; int follow_owner; int protect_owner; /* dont dest the room im in */ int query_no_clean_up() { return 1; } int query_follow_owner() { return follow_owner; } int query_protect_owner() { return protect_owner; } int query_henchman() { return 1; } object query_owner() { return owner; } void house_clean(); void save_my_data(); void load_my_data(); create() { monster::create(); call_out("find_owner", 1); join_room_mess = "The pet finds its owner quickly."; join_me_mess = "The pet finds you cute, and cuddles you happily."; leave_room_mess = "The pet vanishes in a puff of octarine smoke!"; my_data = ([ ]); } void set_join_room_mess(string str) { join_room_mess = str; } void set_leave_room_mess(string str) { leave_room_mess = str; } void set_join_me_mess(string str) { join_me_mess = str; } void set_owner(object ob) { owner = ob; save_my_data(); } void set_follow_owner(int i) { follow_owner = i; } void set_protect_owner(int i) { protect_owner = i; if(protect_owner == 1) { call_out("do_protect", 0, this_object()->query_owner()->query_name()); } } void find_owner() { load_my_data(); tell_room(environment(),join_room_mess+"\n",owner); tell_object(owner,join_me_mess+"\n"); } void house_clean() { tell_room(environment(),leave_room_mess+"\n"); dest_me(); } void owner_left() { if(short(0)) tell_room(this_object(),short(0)+" (henchman) left the game.\n"); dest_me(); } void reset() { if(!environment() || !owner || !environment(owner)) { house_clean(); return; } remove_call_out("check_for_owner"); if(environment() != environment(owner)) { call_out("check_for_owner",10); return; } save_my_data(); return; } /** rewrote this...Raskolnikov **/ void check_for_owner() { if(!environment() || !owner || !environment(owner)) { house_clean(); return; } save_my_data(); return; } void load_my_data() { string s; object ob; my_data = query_property("my_data"); // Taniwha, in the vaugue hope it'll stop spamming the logs if(!mappingp(my_data)) return; s = my_data["owner"]; if(s) ob = find_player(s); if(!ob || environment() != environment(ob)) { house_clean(); return; } owner = ob; set_level(my_data["level"]); set_thac0(my_data["thac0"]); adjust_tmp_str(my_data["tmp_str"]); adjust_tmp_con(my_data["tmp_con"]); adjust_tmp_dex(my_data["tmp_dex"]); adjust_tmp_int(my_data["tmp_int"]); adjust_tmp_wis(my_data["tmp_wis"]); adjust_tmp_cha(my_data["tmp_cha"]); set_max_hp(my_data["max_hp"]); set_max_gp(my_data["max_gp"]); set_hp(my_data["hp"], this_object()); set_gp(my_data["gp"]); adjust_volume(0,my_data["volume"]); adjust_align(my_data["align"]); set_gender(my_data["gender"]); total_xp = my_data["total_xp"]; xp = my_data["xp"]; set_wimpy(my_data["wimpy"]); godalign = my_data["godalign"]; ethics = my_data["ethics"]; return; } void save_my_data() { my_data["owner"] = owner->query_name(); my_data["level"] = query_level(); my_data["thac0"] = query_thac0(); my_data["tmp_str"] = query_tmp_str(); my_data["tmp_con"] = query_tmp_con(); my_data["tmp_dex"] = query_tmp_dex(); my_data["tmp_int"] = query_tmp_int(); my_data["tmp_wis"] = query_tmp_wis(); my_data["tmp_cha"] = query_tmp_cha(); my_data["max_hp"] = query_max_hp(); my_data["max_gp"] = query_max_gp(); my_data["hp"] = query_hp(); my_data["gp"] = query_gp(); my_data["volume"] = query_volume(0); my_data["align"] = query_align(); my_data["gender"] = query_gender(); my_data["total_xp"] = query_total_xp(); my_data["xp"] = query_xp(); my_data["wimpy"] = query_wimpy(); my_data["godalign"] = godalign; my_data["ethics"] = ethics; add_property("my_data",my_data); return; } void heart_beat() { object me = this_object(); if(!me->query_owner()) return ::heart_beat(); if(me->query_follow_owner() != 1) return ::heart_beat(); if(environment(me) == environment(me->query_owner())) return ::heart_beat(); tell_room(environment(me), me->query_cap_name()+" follows " ""+me->query_owner()->query_cap_name()+".\n"); me->move(environment(me->query_owner())); tell_room(environment(me), me->query_cap_name()+" arrives with " ""+me->query_owner()->query_cap_name()+".\n"); return ::heart_beat(); }