/* /std/drink.c * from Nightmare IV * standard drink code * created by Bohemund of NH 940403 */ #include <std.h> #include <config.h> #include "drink.h" inherit OBJECT; private int __Strength; private string __Type, __EmptyName; private function __DrinkFunction; private mapping __Messages; void create() { __Type = "alcoholic"; __EmptyName = "bottle"; __DrinkFunction = 0; ::create(); set_vendor_type("drink"); set_drink("$N drink $O.", "$N drinks $O"); } void init() { ::init(); if(environment(this_object()) != this_player()) return; add_action("cmd_drink", "drink"); } int cmd_drink(string str) { object ob; string tmp; if(present(lower_case(str), this_player()) != this_object()) return 0; if((object)this_player()->query_current_attacker()) return notify_fail("You cannot drink while in combat!\n"); switch(query_type()) { case "soft drink": if(!((int)this_player()->add_quenched(query_strength()))) return notify_fail("You are too bloated to drink!\n"); break; case "caffeine": if((int)this_player()->query_intox() < query_strength()) return notify_fail("You do not feel the need for that right now.\n"); if(!((int)this_player()->add_quenched(query_strength()))) return notify_fail("You are too bloated to drink that!\n"); this_player()->add_intox(-query_strength()/2); break; case "alcoholic": if(!((int)this_player()->add_intox(query_strength()))) return notify_fail("You are already about to pass out!\n"); break; } this_player()->heal(query_strength()); if(!__DrinkFunction || !functionp(__DrinkFunction)) { tmp = replace_string(replace_string(__Messages["my"], "$N", "you"), "$O", query_short()); message("my_action", capitalize(tmp), this_player()); tmp = replace_string(replace_string(__Messages["other"], "$N", (string)this_player()->query_cap_name()), "$O", query_short()); message("other_action", capitalize(tmp), environment(this_player()), ({ this_player() })); } else (*__DrinkFunction)(); ob = new(OBJECT); tmp = query_empty_name(); ob->set_name(sprintf("an empty %s", tmp)); ob->set_id( ({ tmp, "container", "empty container" }) ); ob->set_short(sprintf("an empty %s", tmp)); ob->set_long(sprintf("An empty %s which used to hold something.", tmp)); ob->set_value(10); ob->set_mass(100); ob->set_destroy(); if((int)ob->move(this_player())) { message("my_action", sprintf("You drop an empty %s!", tmp), this_player()); message("other_action", sprintf("%s drops an empty %s", (string)this_player()->query_cap_name(), tmp), environment(this_player()), ({ this_player() })); ob->move(environment(this_player())); } this_object()->remove(); return 1; } varargs void set_drink(mixed val, string str) { if(!str && !functionp(val)) error("Wrong number of arguments to set_drink().\n"); else if(str) { if(!stringp(val)) error("Bad argument 1 to set_drink().\n"); else if(!stringp(str)) error("Bad argument 2 to set_drink().\n"); __Messages = ([ "my" : (string)val, "other" : str ]); } else __DrinkFunction = (function)val; } function query_drink_function() { return (__DrinkFunction ? copy(__DrinkFunction) : 0); } string query_my_msg() { return (__DrinkFunction ? 0 : __Messages["my"]); } string query_other_msg() { return (__DrinkFunction ? 0 : __Messages["other"]); } void set_strength(int x) { __Strength = x; } int query_strength() { return __Strength; } void set_type(string str) { __Type = str; } string query_type() { return __Type; } void set_empty_name(string str) { __EmptyName = str; } string query_empty_name() { return __EmptyName; } #ifdef __OLD_FOOD__ void set_my_mess(string str) { if(!__Messages) __Messages = allocate_mapping(2); __Messages["my"] = str; } void set_your_mess(string str) { if(!__Messages) __Messages = allocate_mapping(2); __Messages["other"] = "$N "+str; } #endif /* __OLD_FOOD__ */