mud++0.35/etc/
mud++0.35/etc/guilds/
mud++0.35/help/propert/
mud++0.35/mudC/
mud++0.35/player/
mud++0.35/src/interface/
mud++0.35/src/os/cygwin32/
mud++0.35/src/os/win32/
mud++0.35/src/os/win32/bcppbuilder/
mud++0.35/src/osaddon/
mud++0.35/src/util/
/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All
................................................ contributions are welcome.
....Copyright(C).1995.Melvin.Smith.............. Enjoy.
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@hom.net
MUD++ development mailing list    mudpp@van.ml.org
------------------------------------------------------------------------------
mudobj.cc
*/

#include "config.h"
#include "mudobj.h"
#include "llist.h"
#include "action.h"
#include "affect.h"

/*
MudObject destructor
*/
MudObject::~MudObject()
{
	Action * act;

	// Delete all actions that the object owns
	o_list.reset();
	while ( ( act = o_list.remove() ) )
	{
		// Call interrupt to ensure the action is removed from
		// BOTH owner AND target
		act->interrupt();
	}

	// Now remove all actions that the object is a target for
	t_list.reset();
	while ( ( act = t_list.remove() ) )
	{
		// Call interrupt to ensure the action is removed from
		// BOTH owner AND target
		act->interrupt();
	}

	Affect * aff;
	while( ( aff = aff_list.remove() ) )
		aff->fordelete();

	struct TriggerData * td;

	while( ( td = triggers.remove() ) )
		delete td;

}


void MudObject::addAffect( Affect * paf )
{
	Modifier * mod;
	for_each( paf->mod_list, mod )
		modify( mod, true );
	SET_BIT( aff_bits, paf->getType() );
	aff_list.add( paf );
}


void MudObject::rmAffect( int aftype )
{
	Affect * paf;
	Modifier * mod;
	for_each( aff_list, paf )
	{
		if( paf->getType() != aftype )
			continue;

		aff_list.remove();
		CLR_BIT( aff_bits, aftype );
		for_each( paf->mod_list, mod )
			modify( mod, false );
	}
}


Affect * MudObject::getAffect( int aftype )
{
	Affect * paf;
	for_each( aff_list, paf )
		if( paf->getType() == aftype )
			return paf;
	return 0;
}

void * MudObject::findTrigger( int type )
{
	struct TriggerData * tmp_td;
	for_each( triggers, tmp_td )
	{
		if ( tmp_td->type == type )
			return tmp_td->fun;
	}
	Cout << "Trigger bit set, but no trigger function. Aborting."<< endl;
	abort();
	// shouldn't go here
	return NULL;
}