#include "path.h" #include <armoury.h> #include <shops/pub_shop.h> inherit "/std/shops/pub_shop"; object *drunkards; object bartender, barmaid; int do_sit(string str); int ref_to_serve(object player, int type); void setup() { set_short("beer room"); set_room_size(5); add_property( "place", "Pumpkin"); set_light(60); set_theft_handler( HOSPITAL ); set_zone("Flaming Cabbage"); set_open_function( (: ref_to_serve :) ); set_long("This is a beer bar. Hence, all the bottles, signs and glasses " "are related to beer. Maybe it could be possible to get something " "else, but most likely, beer (and of course the sort of healthy, " "nutritious food that goes along with beer) is all they sell here. " "The customers, sitting on chairs around the tables, are all drinking " "beer and chatting merrily. At one of the more secluded tables, " "some seedy-looking characters are whispering less merrily. Of course, " "they too are enjoying a tasty beer. A menu is tacked to the " "wall behind the counter.\n"); add_item("floor", "The floor is sticky, and it seems like it'd be hard " "to walk out of here. That could explain why some of the clientele " "here seem to have been drinking for days."); add_item("sign","There are a number of signs in this bar. Most of " "them are tacky, sticky old cardboard signs pointing out the " "special benefits of drinking beer X or ale Y."); add_item("bottle","There are a vast amount of bottles on the wall " "behind the counter. They all seem to be the same sort, and quite " "a few of them seem to be empty. At least they catch the seedy " "light in a very pretty way."); add_item("glass","Beer glasses (the empty kind which are not overly dirty " "on the inside) are flooding the bar behind the counter. Considering " "how empty, used glasses seem to disappear altogether, it is probably " "necessary to have quite a few glasses around."); add_item(({"customer","clientele"}), "The people in here seem to be " "mainly concerned with the intake of beer. They all look rather red " "around their noses and, for some reason, they all look rather " "happy. All except those who wouldn't be caught dead doing something " "as silly as looking happy, of course."); add_item(({"seedy-looking character","character","corner"}), "In a " "corner of the bar, some people (who seem to melt in extraordinarily " "well into the dark shadows) are quietly drinking some beer, keeping " "a watchful eye on everything that happens"); add_item(({"bar","counter"}), "The counter runs along one wall of the " "room. All empty glasses put on it seem to disappear to some other " "dimension. Only Dogbolter, the God of Empty Beer Pints, knows " "where that is."); add_item("wall", "The walls are sticky with dried in beer. Somehow it " "has ended up on the walls, but there is nothing here to explain how. " "On one of the walls there's a sign - it appears to be stuck there " "without the aid of a pin or anything..."); add_item("ceiling", "The ceiling is sticky. They must have had quite a " "party here recently. Or maybe they had a party a long time ago and " "just haven't washed the ceiling since?"); add_item( "wooden table", ({"long", "This is a rather nice wooden " "table. At least it could be, somewhere underneath all that " "sticky beer.", "position","the wooden table"})); add_item( "small table", ({"long", "This table is made of wood, but a " "lot smaller than the other tables here.", "position","the small table"})); add_item( "sticky table", ({"long", "This large table is a lot stickier " "than anything else in here, and that means it's pretty darn sticky!", "position","the sticky table"})); add_item( "old chair", ({ "long", "The chairs around the wooden table are old and worn.", "position","the wooden table" }) ); add_item( "small chair", ({ "long", "The chairs around the wooden table are old and worn.", "position","a chair at the wooden table" }) ); add_item("sticky beer", "It's just about everywhere."); add_menu_item("Spicy sausage", PUB_APPETISER, 396, "spicy sausage"); add_menu_alias("sausage", "Spicy sausage"); add_menu_item("Salad", PUB_MAINCOURSE, 796, "salad", PUB_STD_SIDEPLATE); add_menu_item("Fish'n'chips", PUB_MAINCOURSE, 1196, "fish'n'chips", PUB_STD_DINNERPLATE); add_menu_item("Ribs", PUB_MAINCOURSE, 1304, "ribs", PUB_STD_DINNERPLATE); add_menu_item("Hot chicken sandwich", PUB_MAINCOURSE, 796, "chicken sandwich"); add_menu_alias("chicken sandwich", "Hot chicken sandwich"); add_menu_item("Ham'n'cheese sandwich", PUB_MAINCOURSE, 796, "ham sandwich"); add_menu_alias("ham sandwich", "Ham'n'cheese sandwich"); add_menu_item("Unnameable liquid", PUB_ALCOHOL, 1704, "unnameable", PUB_STD_PINT, 0, 1); add_menu_alias("unnameable", "Unnameable liquid"); add_menu_item("CMOTD's Finest Brew", PUB_ALCOHOL, 1704, "finest brew", PUB_STD_PINT, 0, 1); add_menu_alias("brew", "CMOTD's Finest Brew"); add_menu_alias("cmotd", "CMOTD's Finest Brew"); add_menu_item("Pumpkine Ale", PUB_ALCOHOL, 1838, "/obj/food/ale.food", PUB_STD_PINT, 0, 1); add_menu_alias("ale", "Pumpkine Ale"); add_menu_item("Troll Beer", PUB_ALCOHOL, 1838, "troll beer", PUB_STD_PINT, 0, 3); add_menu_alias("beer", "Troll Beer"); add_menu_item("Schlorg Beer", PUB_ALCOHOL, 1838, "schlorg beer", "schlorg bottle", 0, 2); add_menu_alias("schlorg", "Schlorg Beer"); add_exit("west", PATH + "squash9", "corridor"); } /* setup() */ object create_item( string word ) { object thing, thang; switch ( word ) { case "spicy sausage" : thing = clone_object( "/obj/food" ); thing->set_weight_per_bite(1); thing->set_name("sausage"); thing->set_short("spicy sausage"); thing->set_long( "The sausage, of a very questionable origin, seems " "to be designed to increase the thirst of whomever eats it.\n" ); thing->set_value( 396 ); thing->set_weight(5); /* thing->add_eat_effect( "SOMETHING THAT MAKES YOU THIRSTY", 120 ); * * so... I'd have to make a thirst effect :P */ return thing; case "unnameable liquid" : thang = clone_object( "/obj/reagents/generic_liquid.ob" ); thang->set_medium_alias("beer"); thang->set_name("unnameable"); thang->set_short( "unnameable liquid" ); thang->set_long( "This sludge is definitely better off without a " "name. If someone was to try to give it a name, it'd have to be " "something along the lines of \"Stinking Mud\", \"Utterly " "Disgusting and Undrinkable Slush\" or maybe just \"Yuck!\".\n" ); thang->add_eat_effect( "/std/effects/ingested/drunk", 40 ); thang->add_eat_effect("/std/effects/ingested/nausea", 100); thang->set_amount( 2000 ); return thang; case "finest brew" : thang = clone_object( "/obj/reagents/generic_liquid.ob" ); thang->set_name("brew"); thang->set_medium_alias("beer"); thang->set_short( "CMOTD's Finest Brew" ); thang->add_alias(({"finest brew","CMOTD's finest","CMOTD's brew"})); thang->set_long( "CMOT Dibbler has produced an amazing beer from " "Pumpkin, weird spices and possibly some more things. Being " "Dibbler, he has of course made sure that the pint is rather " "a small one.\n" ); thang->add_eat_effect( "/std/effects/ingested/drunk", 50 ); thang->set_amount( 980 ); return thang; case "troll beer" : thang = clone_object( "/obj/reagents/generic_liquid.ob" ); thang->add_alias("beer"); thang->set_name("beer"); thang->set_short("troll beer"); thang->add_adjective("pint"); thang->set_long("This is trollish beer. You suspect a human " "shouldn't really be drinking this stuff.\n" ); thang->add_alias( "trollbeer" ); thang->add_adjective("troll"); thang->add_eat_effect("/std/effects/ingested/drunk", 70); thang->set_amount( 2000 ); return thang; case "schlorg" : /* the stuff that goes in the bottle */ thang = clone_object( "/obj/reagents/generic_liquid.ob" ); thang->set_name("schlorg"); thang->set_short("Schlorg"); thang->set_medium_alias("beer"); thang->set_long("This beer must be \"forn\". It has none of the " "characteristic muddiness that all beer brewed from Pumpkin water " "possesses.\n" ); thang->add_eat_effect("/std/effects/ingested/drunk", 180); thang->set_amount(3900); thang->move(thing); thing->do_close(); return thing; break; case "salad" : thing = clone_object( "/obj/food" ); thing->set_name("salad"); thing->add_property("food", 1); thing->set_short( "green salad" ); thing->set_long( "This green salad is at least partially green, " "with interesting bits and thingies in it.\n" ); thing->add_eat_effect("/std/effects/ingested/nausea", 10); thing->set_value( 796 ); thing->set_amount( 2000 ); return thing; case "fish'n'chips" : thing = clone_object( "/obj/food" ); thing->add_alias(({"fish","chips"})); thing->add_property("food", 1); thing->set_name("cod"); thing->set_short( "fish'n'chips" ); thing->set_long( "It's hard to tell what is the fish and which of " "the small, sloppy pieces that are supposed to be the chips. " "They all taste the same anyway.\n" ); thing->add_eat_effect("/std/effects/ingested/nausea", 10); thing->set_value( 1196 ); thing->set_amount( 2000 ); return thing; case "ribs" : thing = clone_object( "/obj/food" ); thing->set_name("ribs"); thing->add_property("food", 1); thing->set_short( "ribs" ); thing->set_main_plural("ribs"); thing->set_long( "These are ribs. What animal(s) they come from is " "not of any interest, rest assured... They are quite a lot smaller " "than the Real Pork Ribs that you can get in the posh restaurants " "in any case.\n" ); thing->set_value( 1304 ); thing->set_amount( 2000 ); return thing; case "chicken sandwich" : thing = clone_object( "/obj/food" ); thing->add_alias("sandwich"); thing->add_property("food", 1); thing->set_name("chicken"); thing->set_short( "hot chicken sandwich" ); thing->set_long( "The chicken on this sandwich is of the green sort. " "It smells funny, moves funny and even sounds a bit funny. The " "only nice thing to say about this sandwich is that it is indeed " "hot. It should probably be eaten with caution, though.\n" ); thing->add_eat_effect("/std/effects/ingested/nausea", 40); thing->set_value( 796 ); thing->set_amount( 2000 ); return thing; case "ham sandwich" : thing = clone_object( "/obj/food" ); thing->add_alias("sandwich"); thing->add_property("food", 1); thing->set_name("ham"); thing->set_short( "ham'n'cheese sandwich" ); thing->set_long( "This sandwich has some ham and some cheese on it, " "which is why it is called a ham and cheese sandwich. It has been " "baked in an oven. A long time ago. It is rather cold an clammy " "now.\n" ); thing->set_value( 796 ); thing->set_amount( 2000 ); return thing; } } /* create_object() */ object create_container(string name) { object thing; switch (name) { case "schlorg" : /* the bottle */ thing = clone_object( "/obj/bottle" ); thing->make_bottle("green", 1000); thing->set_value(1596); thing->set_long( (string)thing->query_long() + "This bottle has a " "slightly odd-looking porcelain cap, and no label at all, " "in the ordinary fashion of Schlorg-bottles discwide.\n"); return thing; } } /* create_container() */ void reset() { int i, j, x, y, z; string *kinds = ({"jolly","burly","fat","happy","drunk","very drunk", "silly"}); j = 5 + random(2); if (sizeof(drunkards) < 3) { drunkards = allocate(j); } for (i=0;i<(sizeof(drunkards));i++) { if (!drunkards[i]) { x = random(sizeof(kinds)); y = random(4); drunkards[i] = clone_object("/obj/monster"); drunkards[i]->set_name("drunkard"); drunkards[i]->add_alias(kinds[x]+"drunkard"); drunkards[i]->add_alias(kinds[x]+" drunkard"); drunkards[i]->add_property("emote",1); drunkards[i]->add_move_zone("Flaming Cabbage"); drunkards[i]->set_short(kinds[x]+" drunkard"); drunkards[i]->set_main_plural(kinds[x]+" drunkards"); drunkards[i]->add_plural("drunkards"); drunkards[i]->add_plural(kinds[x]+" drunkards"); drunkards[i]->set_gender(1+random(1)); drunkards[i]->set_long("This "+kinds[x]+" drunkard seems very " "content with sitting here, chugging down beer after beer. Who " "can blame " + drunkards[i]->query_objective() + ", really?\n"); drunkards[i]->set_race("human"); drunkards[i]->set_al(-300 + random(600)); drunkards[i]->set_guild("fighters"); drunkards[i]->set_class("fighter"); drunkards[i]->adjust_con(10); drunkards[i]->adjust_str(5); drunkards[i]->adjust_dex(-1); drunkards[i]->set_level(75 + random(25)); drunkards[i]->add_skill_level( "other.health", 50 ); drunkards[i]->add_skill_level("fighting.combat.melee", 20+random(20)); drunkards[i]->add_skill_level("fighting.combat.special",30); drunkards[i]->adjust_money(0 + random(1),"Pumpkin dollar"); drunkards[i]->adjust_money(10+ random(20),"Pumpkin pence"); switch(y) { case 0: ((object)ARMOURY->request_item("dagger",30 + random(30)))->move(drunkards[i]); /* ((object)ARMOURY->request_item("cloth robe",30 + random(30)))->move(drunkards[i]); */ drunkards[i]->init_equip(); drunkards[i]->do_command("tactics response parry"); drunkards[i]->add_skill_level("fighting.combat.parry.held", 50+random(100)); break; case 1: ((object)ARMOURY->request_item("knife",70 + random(20)))->move(drunkards[i]); ((object)ARMOURY->request_item("green pants",70 + random(20)))->move(drunkards[i]); drunkards[i]->init_equip(); drunkards[i]->do_command("tactics response parry"); drunkards[i]->add_skill_level("fighting.combat.parry.held", 50+random(20)); break; default: ((object)ARMOURY->request_item("knife",30 + random(30)))->move(drunkards[i]); ((object)ARMOURY->request_item("green pants",70 + random(20)))->move(drunkards[i]); drunkards[i]->init_equip(); drunkards[i]->add_property("emote", 1); drunkards[i]->do_command("tactics response parry"); drunkards[i]->add_skill_level("fighting.combat.parry.held", 20+random(20)); drunkards[i]->load_chat(2,({ 1, "'I need another beer.", 1, "'Bring me some beer, will you?", 1, "'I jolly well need beer! Hurry up!" })); } drunkards[i]->move("/room/void"); y = random(4); z = 40 + random(90); call_out("make_drunk", z, drunkards[i], y, kinds[x]); } } if (!bartender) { bartender = clone_object( "/obj/monster" ); bartender->set_name("bartender"); bartender->set_short("sympathetic bartender"); bartender->add_property("determinate","a "); bartender->set_long("This bartender looks just like you would " "expect in a place like this. He has a huge red beard and seems " "to be laughing and smiling in a friendly manner at everyone all " "the time.\n"); bartender->set_race("human"); bartender->set_gender( 1 ); bartender->set_al( -350 ); bartender->set_class("fighter"); bartender->set_level(100); bartender->do_command("tactics attitude offensive"); bartender->do_command("tactics response parry"); bartender->adjust_con(6); bartender->adjust_str(6); bartender->adjust_dex(3); bartender->add_skill_level( "other.health",55); bartender->add_skill_level("fighting.combat.melee.sharp",100); bartender->add_skill_level("fighting.combat.special",50); ((object)ARMOURY->request_item("dagger",100))->move(bartender); ((object)ARMOURY->request_item("dagger",85))->move(bartender); ((object)ARMOURY->request_item("leather undershirt",80))-> move(bartender); ((object)ARMOURY->request_item("leather breeches",80))->move(bartender); ((object)ARMOURY->request_item("white apron",80))->move(bartender); bartender->add_respond_to_with( ({({"@spank"}),"bartender"}), "thank $hname$ profusely"); bartender->load_chat(25,({ 1, ":brings some beer out to his thirsty customers.", 1, "@wink barmaid", 1, "@beam brightly", 1, "@hum", 1, "@laugh", 1, ":laughs pleasantly.", 1, "'Well, well - what have we here?", 1, "'Bring you another beer, shall I?" })); bartender->init_equip(); barmaid = clone_object( "/obj/monster" ); barmaid->set_name("barmaid"); barmaid->set_short("lovely barmaid"); barmaid->set_long("This barmaid looks happy with her work. She smiles " "a lot and has a noticeable tendency to flutter her eye-lashes at " "the bartender.\n"); barmaid->set_race("human"); barmaid->set_class("fighter"); barmaid->set_level(50); barmaid->set_gender(2); ((object)ARMOURY->request_item("white linen skirt",80))->move(barmaid); ((object)ARMOURY->request_item("white apron",80))->move(barmaid); barmaid->init_equip(); call_out("make_bart", 20, bartender, barmaid); } } /* reset */ void make_drunk(object ob, int y, string str) { int a = random(2); string adj, adv; adv = ({ "not at all", "very", "quite", "extremely", "rather" }) [ random(5) ]; ob->move(this_object(), "A "+ str + " drunkard comes in, looking " + adv + " thirsty."); switch (y) { case 0: adj = "small"; break; case 1: case 2: adj = "wooden"; break; case 3: adj = "sticky"; break; } if (a) ob->do_command("sit at "+adj+" table"); y = 5 + random(50); call_out("buy_new", y, ob); } /* make_drunk() */ void make_bart(object ob, object obette) { ob->move(this_object(), "The bartender pops up from behind the counter " "with a wide grin on his face."); call_out("make_barm", 5, obette); } /* make_bart() */ void make_barm(object ob) { ob->move(this_object(), "The barmaid appears from behind the counter and " "tries to look innocent. She desperately tries to sort out her " "hair which is a bit unordered."); } /* make_barm() */ void buy_new(object ob) { int tim; if (!undefinedp(ob)) { if (environment(ob) == this_object()) { int z; string beer; beer = ({ "troll beer", "brew", "brew", "unnameable liquid" })[ random(4) ]; ob->adjust_money(5, "Pumpkin dollar"); ob->do_command("buy " + beer ); ob->do_command("hold glass in left hand"); z = 120 + random(120); // // Make them take a sip every ten seconds or so... /* No! Way too spammy! I'll go for > 30 seconds though... * * Danbala, feb 2000 */ // tim = 20 + random(20); while (tim < z) { call_out("sip_beer", tim, ob); tim += 30 + random(20); } call_out("drink_beer", z, ob); } } } /* buy_new() */ void sip_beer(object ob) { if (ob && environment(ob) == this_object()) { ob->do_command("drink 1/3rd of glass"); } } /* sip_beer() */ void drink_beer(object ob) { if (!undefinedp(ob)) { ob->do_command("drink glass"); ob->do_command("'Ha! Nice beer, this."); call_out("no_litter",3,ob); } } /* drink_beer() */ void no_litter(object ob) { object pint, *obinv; int z; int a = random(2); if (!ob) { return ; } obinv = deep_inventory(ob); if (sizeof(obinv)) { foreach( pint in obinv ) { if (pint->query_max_volume()) { switch (a) { case 0: ob->do_command("'Ah. An empty pint. Now what would I " "want that for?"); break; case 1: ob->do_command("'Bugger. It's all empty. Now I'm sad."); break; case 2: ob->do_command("'No more beer. What has the world come to?"); break; } ob->do_command("put " + pint->query_name() + " on counter"); } } } if (a) { z = 120 + random(240); call_out("buy_new", z, ob); } else { ob->do_command("north"); } } /* no_litter() */ int ref_to_serve(object player, int type) { int clock, servtime; clock = (time()%(3600*24)); servtime = ((clock > 35000) && (clock < 60000)); /* Because we all know pubs don't really serve food when they say * * they should, but at other mysterious times, when noone wants food * * anyway. */ if((!servtime) && (type == PUB_MAINCOURSE)) { add_failed_mess("Unfortunately, this pub doesn't serve food at the " "moment. Try to change your order, please.\n"); return 2; } } /* ref_to_serve() */ void event_enter(object ob, string str, object from) { if (ob->query_name() == "drunkard") { if( sizeof( match_objects_for_existence( "pint", ob ))) { ob->do_command("'Time for another beer for me."); call_out("buy_new",5 + random(50),ob); } } } /* event_enter() */