#include <mudlib.h> inherit MONSTER; #define NAME (string)this_player()->query_name() #define LEVEL (int)this_player()->query_level() #define MY_STAT 17 #define YOUR_STAT (int)this_player()->query_charisma() #define ROOM_MOD 200 /****************************************************************************/ /* Fn prototypes */ void check(); void make_doors(string str, object obj); status rent_room(); int room_cost(); int counter, i; void reset(status arg) { string *rooms; if(!present("dagger")) { move_object(clone_object("room/city/obj/dagger"),this_object()); } set_wc(30); ::reset(arg); init_command("wield dagger"); rooms = ({ "/room/city/pub/inn1", "/room/city/pub/inn2", "/room/city/pub/inn3", "/room/city/pub/inn4", "/room/city/pub/hall1", "/room/city/pub/hall2", "/room/city/pub/hall3", "/room/city/pub/hall4", }); /* initialise the rooms for rent */ for(i=0; i<sizeof(rooms); i++) { call_other(rooms[i], "reset", 1); } if(arg) return; counter = 0; set_name("samantha"); set_alias("thief"); set_short("Samantha, the Grandmaster Thief"); set_long( "Her short brown hair and dark seductive eyes and smile makes \n"+ "her renowned across the city as a man killer. No one can resist \n"+ "this woman, no one dares to. No living man has ever known to \n"+ "say no to her. "); set_level(19); set_gender(2); set_race("human"); set_hp(2100); set_wc(30); set_ac(15); add_class("fighter"); add_class("mage"); add_class("thief"); add_class("cleric"); load_spells(10, ({ "chain lightning", "cure light wounds", "cure serious wounds", "burning hands", "comet", "ice storm", "disintegrate", "hold person", "vampiric touch", })); load_chat(7, ({ "Samantha asks: Would you like to spend the night here?\n", "Samantha looks you up and down with careful eyes.\n", "Samantha smiles at you seductively\n", "Samantha says: The rooms are up stairs, and are quite cheap.\n" })); load_a_chat(5, ({ "Samantha says: You shouldn't tangle with me.\n", "Samantha says: I wouldn't do that if I were you.\n", "Samantha asks: Feel like a bit of sport, hmm..?\n", "Samantha says: I'm stronger than you think.\n", "Samantha tumbles away from your blow.\n", "Samantha kicks you hard.\n", "Samantha punches you in the face.\n" })); for(i=0; i<4; i++) { object ob; ob = clone_object("room/city/pub/key"); move_object(ob, this_object()); } } void init() { check(); ::init(); } void catch_tell(string str) { string tmp1, tmp2; if(sscanf(str, "%s says: rent %s", tmp1, tmp2) || sscanf(str, "%s says: room %s", tmp1, tmp2)) rent_room(); } /****************************************************************************/ /* Fns to rent rooms */ status rent_room() { object key, door; int cost; if(!present("key", this_object())) { tell_room(environment(), "Samantha says: Sorry "+ NAME +", but I don't "+ "have any rooms left to rent.\n"); return 1; } if(key = (present("key", this_player()))) { if(!counter) { if(key -> id(NAME)) { tell_room(environment(), "Samantha says: You've stolen one of "+ "my keys!\nSamantha snatches the key away!\n"); destruct(key); return 1; } } if(environment() -> query_players(NAME)) { tell_room(environment(), "Samantha says: But "+NAME+", you already "+ "have rented a room.\n"); return 1; } } tell_object(this_player(), "Samantha haggles with you over the price of "+ "a room.\n"); cost = room_cost(); if(random(MY_STAT) > random(YOUR_STAT)) cost += random(cost) /3; else cost -= random(cost) /4; if(this_player()->query_money() < cost) { tell_room(environment(), "Samantha says: But you don't have "+ cost +" copper coins for the room!\n"); return 1; } tell_object(this_player(), "Samantha takes "+ cost +" copper coins for the room.\n"); this_player()->add_money(-cost); key = present("key", this_object()); key -> set_alias(NAME); key -> set_number(counter + 1); if(!this_player()->add_weight(1)) { tell_room(environment(), "Samantha says: You cannot carry this key, "+ NAME +", so I will just leave it here.\nSamantha drops a key.\n"); move_object(key, environment(this_object())); } else { tell_object(this_player(), "Samantha gives you a key.\n"); say("Samantha gives "+NAME+" a key.\n",this_player()); move_object(key, this_player()); } tell_object(this_player(), "You write your name in the inn's register.\n"); say(NAME +" writes "+this_player()->query_possessive() +" name "+ "in the inn's register.\n",this_player()); make_doors(NAME, this_player()); environment()->add_players(NAME); return 1; } int room_cost() { return ROOM_MOD * (int)this_player()->query_level(); } void make_doors(string str, object obj) { counter++; /* start off at room 1 */ if(!present("key", this_object())) { write("Sam says: There's something wrong. I seem to have no vacancies "+ "after all.\n"); return; } call_other("/room/city/pub/inn"+counter, "load_door", ({ "file", "room/city/pub/hall"+counter, "closed", "locked", "long", "A door of solid oak.\n", "lock id", "lock", "lock long", "A lock that bears the number "+counter+".\n", "key id", (string)obj->query_name(), "lock difficult", 10 + (int)obj->query_level(), "direction", "east door", }) ); call_other("/room/city/pub/hall"+counter, "load_door", ({ "file", "room/city/pub/inn"+counter, "closed", "locked", "long", "A door of solid oak.\n", "lock id", "lock", "lock long", "A lock that bears the number "+counter+".\n", "key id", (string)obj->query_name(), "lock difficult", (int)obj->query_level(), "direction", "west door", }) ); } void check() { object *obj; if(!counter) { if(present("key", this_player())) { obj = all_inventory(this_player()); for(i=0; i<sizeof(obj); i++) { if(obj[i] -> id("skandles downfall")) { tell_room(environment(), "Samantha says: Hey "+NAME+", how did you get that!\n"); say("Samantha snatches the key away from "+NAME+".\n", this_player()); tell_object(this_player(), "Samantha snatches the key away from you!\n"); destruct(obj[i]); } } } } }