tmi2_fluffos_v2/
tmi2_fluffos_v2/bin/
tmi2_fluffos_v2/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/ChangeLog.old/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/Win32/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/simuls/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/clone/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/command/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/data/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/master/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/log/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/u/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/tmp/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/windows/
tmi2_fluffos_v2/lib/
tmi2_fluffos_v2/lib/adm/
tmi2_fluffos_v2/lib/adm/daemons/languages/
tmi2_fluffos_v2/lib/adm/daemons/network/I3/
tmi2_fluffos_v2/lib/adm/daemons/virtual/
tmi2_fluffos_v2/lib/adm/daemons/virtual/template/
tmi2_fluffos_v2/lib/adm/news/
tmi2_fluffos_v2/lib/adm/obj/
tmi2_fluffos_v2/lib/adm/obj/master/
tmi2_fluffos_v2/lib/adm/priv/
tmi2_fluffos_v2/lib/adm/shell/
tmi2_fluffos_v2/lib/adm/tmp/
tmi2_fluffos_v2/lib/cmds/
tmi2_fluffos_v2/lib/d/
tmi2_fluffos_v2/lib/d/Conf/
tmi2_fluffos_v2/lib/d/Conf/adm/
tmi2_fluffos_v2/lib/d/Conf/boards/
tmi2_fluffos_v2/lib/d/Conf/cmds/
tmi2_fluffos_v2/lib/d/Conf/data/
tmi2_fluffos_v2/lib/d/Conf/logs/
tmi2_fluffos_v2/lib/d/Conf/obj/
tmi2_fluffos_v2/lib/d/Conf/text/help/
tmi2_fluffos_v2/lib/d/Fooland/adm/
tmi2_fluffos_v2/lib/d/Fooland/data/
tmi2_fluffos_v2/lib/d/Fooland/data/attic/
tmi2_fluffos_v2/lib/d/Fooland/items/
tmi2_fluffos_v2/lib/d/TMI/
tmi2_fluffos_v2/lib/d/TMI/adm/
tmi2_fluffos_v2/lib/d/TMI/boards/
tmi2_fluffos_v2/lib/d/TMI/data/
tmi2_fluffos_v2/lib/d/TMI/rooms/
tmi2_fluffos_v2/lib/d/grid/
tmi2_fluffos_v2/lib/d/grid/adm/
tmi2_fluffos_v2/lib/d/grid/data/
tmi2_fluffos_v2/lib/d/std/
tmi2_fluffos_v2/lib/d/std/adm/
tmi2_fluffos_v2/lib/data/adm/
tmi2_fluffos_v2/lib/data/adm/daemons/
tmi2_fluffos_v2/lib/data/adm/daemons/doc_d/
tmi2_fluffos_v2/lib/data/adm/daemons/emoted/
tmi2_fluffos_v2/lib/data/adm/daemons/network/http/
tmi2_fluffos_v2/lib/data/adm/daemons/network/services/mail_q/
tmi2_fluffos_v2/lib/data/adm/daemons/network/smtp/
tmi2_fluffos_v2/lib/data/adm/daemons/news/archives/
tmi2_fluffos_v2/lib/data/attic/connection/
tmi2_fluffos_v2/lib/data/attic/user/
tmi2_fluffos_v2/lib/data/std/connection/b/
tmi2_fluffos_v2/lib/data/std/connection/l/
tmi2_fluffos_v2/lib/data/std/user/a/
tmi2_fluffos_v2/lib/data/std/user/b/
tmi2_fluffos_v2/lib/data/std/user/d/
tmi2_fluffos_v2/lib/data/std/user/f/
tmi2_fluffos_v2/lib/data/std/user/l/
tmi2_fluffos_v2/lib/data/std/user/x/
tmi2_fluffos_v2/lib/data/u/d/dm/working/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/smtp/
tmi2_fluffos_v2/lib/doc/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/interactive/
tmi2_fluffos_v2/lib/doc/driverdoc/concepts/
tmi2_fluffos_v2/lib/doc/driverdoc/driver/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/arrays/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/buffers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/compile/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/ed/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/filesystem/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/floats/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/functions/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/general/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/mappings/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/numbers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/parsing/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/constructs/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/preprocessor/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/types/
tmi2_fluffos_v2/lib/doc/driverdoc/platforms/
tmi2_fluffos_v2/lib/doc/mudlib/
tmi2_fluffos_v2/lib/ftp/
tmi2_fluffos_v2/lib/include/driver/
tmi2_fluffos_v2/lib/log/
tmi2_fluffos_v2/lib/log/driver/
tmi2_fluffos_v2/lib/obj/net/
tmi2_fluffos_v2/lib/obj/shells/
tmi2_fluffos_v2/lib/obj/tools/
tmi2_fluffos_v2/lib/std/adt/
tmi2_fluffos_v2/lib/std/board/
tmi2_fluffos_v2/lib/std/body/
tmi2_fluffos_v2/lib/std/fun/
tmi2_fluffos_v2/lib/std/living/
tmi2_fluffos_v2/lib/std/object/
tmi2_fluffos_v2/lib/std/shop/
tmi2_fluffos_v2/lib/std/socket/
tmi2_fluffos_v2/lib/std/user/
tmi2_fluffos_v2/lib/std/virtual/
tmi2_fluffos_v2/lib/student/
tmi2_fluffos_v2/lib/student/kalypso/
tmi2_fluffos_v2/lib/student/kalypso/armor/
tmi2_fluffos_v2/lib/student/kalypso/rooms/
tmi2_fluffos_v2/lib/student/kalypso/weapons/
tmi2_fluffos_v2/lib/u/l/leto/
tmi2_fluffos_v2/lib/u/l/leto/cmds/
tmi2_fluffos_v2/lib/www/errors/
tmi2_fluffos_v2/lib/www/gateways/
tmi2_fluffos_v2/lib/www/images/
tmi2_fluffos_v2/old/
tmi2_fluffos_v2/win32/
// container.c
// Hacked together by Mobydick@TMI-2 on 9-29-92 from two pre-existing files.
// The first, bag_logic.c, was mostly written by Brian@TMI. The second,
// container.c, was written by Sulam@TMI. Original documentation follows:
/*
 * bag_logic.c
 * Written by Brian Nov 1991
 * Added get all from container Feb 6 1992
 *
 * This works in conjunction with my move and container to make it very easy
 * to make containers.
 *
 * set possible_to_close = 1; if you want the container to be closable.
 *
 * somewhat modifed by Truilkan@TMI - 92/04/21
 *
 * this has a query_long() that will be checked for when you call 
 * query("long").  any object inheriting std/bag_logic should not directly
 * inherit std/Object or /std/container.
 */
// Mobydick made some major changes while getting mass and bulk to work properly
// Mobydick added money functions, 10-12-92
// Mobydick cleaned out some unused variables and functions, 10-14-92.
// Watcher added prevent_get and prevent_drop aspect checks, 3-5-93.
// Watcher added vision checks and made a few bug fixes, 4-13-93.

#include <move.h>
#include <mudlib.h>
#include <money.h>

inherit OBJECT ;

string open_long_desc;
string closed_long_desc;
private static int possible_to_close;
private static int is_closed;

int receive_objects();

void create()
{
	seteuid(getuid()) ;
	set("long", "@@query_long");
}

void init()
{
   add_action("get_from","get");
   add_action("put_into","put");
   add_action("open_container","open");
   add_action("close_container","close");
}

int put_into(string str) {
	int res, num, has, mass ;
	object ths,tht,ob ;
	string this,that, word ;

	if (!str) {
		notify_fail("Put what in what?\n") ;
		return 0 ;
	}
 
	//  Check to make sure the person can see what they are doing.

	if(!this_player()->query("vision")) {
	write("Put what where?  You can't see anything!\n");
	return 1; }
 
	//  Check for the form "put 10 gold in bag".
 
	if (sscanf(str,"%d %s in %s",num,this,that)==3) {
		if(num < 1) {
		notify_fail ("You must put positive amounts of coins into things.\n") ;
		return 0 ;
		}
		tht = present(that,this_player()) ;
		if (!tht) tht = present(that,environment(this_player())) ;
		if (!tht) {
			notify_fail ("I don't see a "+that+" to put money into.\n") ;
			return 0 ;
		}
	// Is the container open?
		if (!receive_objects()) {
			notify_fail ("The container is closed.\n") ;
			return 0 ;
		}
		if (tht!=this_object()) return 0 ;
		has = this_player()->query("wealth/"+this) ;
		if (has<num) {
			notify_fail ("You don't have that many "+this+" coins.\n") ;
			return 0 ;
		}
		ob = clone_object(COINS) ;
		ob->set_type(this) ;
		ob->set_number(num) ;
		res = ob->move(tht) ;
		if (res!=MOVE_OK) {
			notify_fail ("Not enough room!\n") ;
			ob->remove() ;
			return 0 ;
		}
		this_player()->set("wealth/"+this,has-num) ;
		this_player()->set("capacity", this_player()->query("capacity") + num) ;
// Make the mass of the container go up.
		set ("mass", query("mass")+num) ;
// If the player is carrying the container, then make his capacity go down.
		if (environment(this_object())==this_player())
			this_player()->set("capacity",(int)this_player()->query("capacity")-num) ;
		if (num==1) word= "coin" ; else word="coins" ;
		write ("You put "+num+" "+this+" "+word+" in "+that+".\n") ;
		say (this_player()->query("cap_name")+" puts "+num+" "+this+" "+word+" in "+that+".\n") ;
		return 1 ;
	}
 
	//  Check for the stand "put thingy in bag" format.
 
	if(!stringp(str) || (sscanf(str, "%s in %s", this, that) != 2 &&
	   sscanf(str, "%s into %s", this, that) != 2))  return 0;
 
	ths = present(this, this_player());
 
	if(!ths) {
	write("You do not have a " + this + ".\n");
	return 1; }
 
	tht = present(that, this_player());

	if(!tht)  tht = present(that, environment(this_player()));
 
	if (ths == tht) {
	    write("You can't put " + this + " in itself.\n");
	    return 1;
	}

	if(!tht) {
	write("There is no " + that + " here.\n");
	return 1; }
 
	if(tht != this_object())  return 0;	// Keep on looking ...

	if((int)ths->query("prevent_drop")) {
	write("You can't move that object.\n");
	return 1; }
 
	if((int)ths->query("prevent_insert")) {
	write("You can't put that object inside a container.\n");
	return 1; }
 
	if(!tht->receive_objects()) {
	write("That object is closed.\n");
	return 1; }
 
		mass = ths->query("mass");
		word = ths->query("short") ;
		res = (int)ths->move(tht);
 
		if (res == MOVE_OK) {
 
// When we put the object into the container, the mass of the container has
// to go up, but the bulk does not go up.
 
		set ("mass", query("mass")+mass) ;
 
// If the player is carrying the container, his capacity has to go down.
 
		if (environment(this_object())==this_player())
		this_player()->set("capacity", 
			(int)this_player()->query("capacity") - mass);
		write("You put " + word + " in " +tht->query("short")+ ".\n");
		say((string)this_player()->query("cap_name") + " puts " +
		    word + " in " + tht->query("short") + ".\n");
		return 1; }
 
		if(res == MOVE_NO_ROOM) 
		write("There isn't enough room left to put that in.\n");
 
		else if(res == MOVE_TOO_HEAVY) 
		write("It is too heavy.\n");
 
		else if(res == MOVE_NOT_ALLOWED) 
		write("You cannot do that.\n");
 
return 1; }
 

int get_from(string str)
{
	int res, i, num, has, mass ;
	object ths, tht, *contents;
	object ob2 ;
	string this, that, word ;

	if (!str) {
		notify_fail ("Get what from what?\n") ;
		return 0 ;
	}
 
	//  Check to see if the user can see what they are doing.
 
	if(!this_player()->query("vision")) {
	write("Get what from where?  You can't see anything!\n");
	return 1; }
 
// Check for the form "get 20 gold from sack".
	if (sscanf(str,"%d %s from %s",num,this,that)==3) {
		tht = present(that,this_player()) ;
		if (!tht) tht = present(that,environment(this_player())) ;
		if (!tht) {
			notify_fail ("Put what in what frog?\n") ;
			return 0 ;
		}
 
	// Is it closed?
		if (!tht->receive_objects()) {
			notify_fail ("That container is closed.\n") ;
			return 0 ;
		}
		if((int)tht->query("prevent_get")) {
		notify_fail("You can't get that object.\n");
		return 0; }
 
		if (!tht) {
			notify_fail ("I don't see a "+that+" here.\n") ;
			return 0 ;
		}
		if (tht!=this_object()) return 0 ;
		ths = present(this,tht) ;
		if (!ths) {
			notify_fail ("There aren't any "+this+" coins in "+that+".\n") ;
			return 0 ;
		}
		if (ths->query_number()<num) {
			notify_fail ("There aren't that many "+this+" coins in "+that+".\n") ;
			return 0 ;
		}
		ob2 = clone_object(COINS) ;
		ob2->set_type(ths->query_type()) ;
		ob2->set_number(num) ;
// If the player is carrying the container, then his capacity needs to go
// up, because removing the object from the container makes the container
// lighter.
		if (environment(this_object())==this_player())
		this_player()->set("capacity", this_player()->query("capacity")+num) ;
		ob2->move(this_player()) ;
		if (res!=MOVE_OK) {
			notify_fail ("You don't feel good about doing that. Tell a wizard.\n") ;
		this_player()->set("capacity", (int)this_player()->query ("capacity")-num) ;
			return 0 ;
		}
		ths->set_number((int)ths->query_number()-num) ;
		if (num==1) word="coin" ; else word = "coins" ;
		write ("You get "+num+" "+this+" "+word+" from "+that+".\n") ;
		say (this_player()->query("cap_name")+" gets "+num+" "+this+" "+word+" from "+that+".\n") ;
// Reduce the mass of the container.
		set ("mass", query("mass")-num) ;
		set ("capacity", query("capacity")+num) ;
		return 1 ;
	}
// Check for the form "get thingy from sack".
// This may or may not be choking on money. I hope not...
	if (stringp(str) && sscanf(str,"%s from %s",this,that) == 2) {
		if (present(that,this_player()) ||
				present(that, environment(this_player()))) {
			tht = present(that);
			if (tht!=this_object()) return 0 ;
			if (tht->receive_objects()) {
			if (this != "all") {
			ths = present(this, tht);
			if (!ths) {
				notify_fail("There is no "+this+" in the "+that+".\n") ;
				return 0 ;
			}

			if((int)ths->query("prevent_get")) {
			notify_fail("You can't get that object.\n");
			return 0; }
 
			if (ths) {
				mass = ths->query("mass") ;
				word = ths->query("short") ;
// When the player removes the object, the container gets lighter, so we
// need to increase the player's capacity.
				if (environment(this_object())==this_player())
				this_player()->set("capacity",(int)this_player()->query("capacity")+mass) ;
				res = (int)ths->move(this_player());
				if (res == MOVE_OK) {
// When we get an object out of a container, the mass of the container goes
// down, but the bulk does not go down.
					set ("mass", query("mass")-mass) ;
					write ("You get "+word+" from "+
						tht->query("short")+".\n");
					say(this_player()->query("cap_name")+" gets "+
						word + " from "+tht->query("short")+".\n") ;
					return 1;
				}
			if (res == MOVE_NOT_ALLOWED) 
				notify_fail("You are not allowed to do that...\n");
			if (res == MOVE_NO_ROOM)
				notify_fail("There is not enough room to do that...\n");
// This should never happen.
			if (res == MOVE_TOO_HEAVY)
				notify_fail ("It is too heavy.\n") ;
			if (environment(this_object())==this_player())
			this_player()->set("capacity",(int)this_player()->query("capacity")-mass) ;
			return 0;
			}
			notify_fail(capitalize(this)+" is not in "+tht->query("short")+".\n");
			return 0;
			}
// If we got here, it means we're doing a "get all from container".
			contents = all_inventory(tht);
			if (sizeof(contents) > 0 ) {
				for (i=0;i<sizeof(contents);i++) {
					ths = contents[i];
 
				if((int)ths->query("prevent_get"))
					continue;
 
					mass = contents[i]->query("mass") ;
					word = contents[i]->query("short") ;
// When the object is removed from the container, if the player is holding
// the container then his capacity goes up.
					if (environment(this_object())==this_player())
					this_player()->set("capacity", (int)this_player()->query("capacity")+mass) ;
					res = (int)ths->move(this_player());
					if (res == MOVE_OK) {
// Change the mass of the container.
						set ("mass", query("mass")-mass) ;
						write ("You take "+word+" from "+tht->query("short")+".\n") ;
						say(this_player()->query("cap_name")+" gets "+
						word+" from "+tht->query("short")+".\n") ;
				}
				if (res == MOVE_NO_ROOM) {
					write("Can't carry "+ths->query("short")+".\n");
					if (environment(this_object())==this_player())
					this_player()->set("capacity", (int)this_player()->query("capacity")+mass) ;
			}
			}
			return 1;
		}
		notify_fail("Nothing in "+tht->query("short")+".\n");
		return 0;
		}
		notify_fail(capitalize(this)+" is not here.\n");
		return 0;
		}
		notify_fail(capitalize(that)+" is closed.\n");
		return 0;
	}
	return 0;
}

void set_closed_long(string str)
{
	closed_long_desc = str;
}

void set_open_long(string str)
{
	open_long_desc = str;
}

string query_long(string str)
{
	object *inv;
	int i;
	mixed desc;
	if (this_object()->receive_objects()) desc = open_long_desc ; else desc = closed_long_desc ;
	if ((int)query("lock")>0) {
		desc = desc + "It is locked.\n" ;
	}
	if ((int)this_object()->receive_objects() || (int)this_object()->clear()) {
		inv = all_inventory(this_object());
		if (sizeof(inv) > 0 ) {
			desc += "It contains:\n";
			for(i=0;i<sizeof(inv);i++)
				desc += "  "+ (string)inv[i]->query("short")+"\n";
		}
	}
	return desc;
}

int open_container(string str)
{
 
	//	Check to see if the user can actually see anything.

	if(!this_player()->query("vision")) {
	notify_fail("Open what?  You can't see anything!\n");
	return 0; }
 
	if (stringp(str) && this_object()->id(str)) {
		if (this_object()->receive_objects()) write("It is already open.\n");
		else {
			if ((int)query("lock")>0) {
				write ("It's locked!\n") ;
				return 1 ;
			}
			this_object()->toggle_closed();
			write("You open "+this_object()->query("short")+".\n");
			say(this_player()->query("cap_name")+
				" opens "+this_object()->query("short")+ ".\n");
		}
		return 1;
	}
	return 0;
}

int close_container(string str)
{
	
	//	Check to see if the user can see what they are doing.
	
	if(!this_player()->query("vision")) {
	notify_fail("Close what?  You can't see anything!\n");
	return 0; }
 
	if (stringp(str) && this_object()->id(str)) {
		if (!this_object()->receive_objects()) write("It is already closed.\n");
	else if (!this_object()->toggle_closed()) write("It cannot be closed.\n");
		else {
			write("You close "+this_object()->query("short")+".\n");
			say(this_player()->query("cap_name")+" closes "+
				this_object()->query("short")+".\n");
		}
		return 1;
	}
	return 0;
}

void set_possible_to_close(int pos) {
    possible_to_close = pos;
}

int toggle_closed() {
    if (possible_to_close) {
      if (is_closed) is_closed = 0;
      else is_closed = 1;
      return 1;
    }
    else return 0;
}

int query_is_closed() {
	return is_closed ;
}


// This function is called from move()

int receive_objects() {
    if (is_closed) return 0;
    return 1;
}

/* EOF */