lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** guild_d.c -- daemon for recording guild information2
**
** Ohara: Design and original implementation
** 951224, Deathblade: updated, installed, etc
*/

inherit M_DAEMON_DATA;

class guild_defn
{
    string        guild_prospectus;	/* info about the guild */
    int           guild_begone;		/* what to do upon leaving guild */
    int           guild_suspend_level;	/* suspend level upon suspension */
    string array  guild_attributes;	/* the guild's attributes */
    string array  guild_exclusive;	/* exclusive attributes */
    string array  guild_allies;		/* allied guilds */
    string array  guild_prereq;		/* prerequisite guilds */
    string array  guild_banned;		/* exclusive guilds */
    string        guild_title;		/* formal title of this guild */
    int           guild_sees_secret;	/* can see other guilds' attrs */
    int           guild_is_secret;	/* attrs are (generally) secret */
    int           guild_need_all;	/* need ALL prereq guilds */
}


private mapping guilds = ([ ]);

#define DEFN(name)	((class guild_defn)guilds[name])

#define SAVE_FILE	"/data/daemons/guild_d"
#define PRIV_NEEDED	"Mudlib"	// owner priv implies Arch-type


void set_guild_title( string name, string title );
void set_guild_banned( string name, string array banned );
void set_guild_prereq( string name, string array prereq );
void set_guild_allies( string name, string array allies );
void set_guild_exclusive( string name, string array exclusive );
void set_guild_attributes( string name, string array attributes );
void set_guild_begone( string name, int begone );
void set_guild_suspend_level( string name, int suspend_level );
void set_guild_prospectus( string name, string prospectus );
void set_guild_sees_secret( string name, int sees_secret );
void set_guild_is_secret( string name, int is_secret );
void set_guild_need_all( string name, int need_all );


string query_guild_title( string name );
string array query_guild_banned( string name );
string array query_guild_prereq( string name );
string array query_guild_allies( string name );
string array query_guild_exclusive( string name );
string array query_guild_attributes( string name );
int query_guild_begone( string name );
int query_guild_suspend_level( string name );
string query_guild_prospectus( string name );
int query_guild_sees_secret(string name);
int query_guild_is_secret(string name);
int query_guild_need_all(string name);

int check_previous(string needed)
{
  if ( check_previous_privilege(needed) )
    return 1;
  if ( base_name(previous_object()) == "/obj/admtool/daemons/guild" )
    return 1;
	return 0;
}


void guild_add( string name )
{
    class guild_defn gi;

    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    gi = new( class guild_defn );
    gi->guild_title = "Title Error";
    gi->guild_prospectus = "We Have Nothing To Offer";
    gi->guild_suspend_level = 1;
    guilds[ name ] = gi;
    save_me();
}


void guild_remove( string name )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    map_delete(guilds, name);
    save_me();
}


void remove_all_guilds()
{
  if(!check_previous( PRIV_NEEDED))
    error( "Insufficient priv to remove all guilds.");
    guilds = ([]);
    save_me();
    write( "Guilds Wiped.\n");
}

void guild_check(string name)
{
    if ( guilds[name] )
	return;

    error("Non-existant guild - " + name + ".\n");
}


void set_guild_title( string name, string title )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_title = title;
    save_me();
}


void set_guild_banned( string name, string array banned... )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_banned = banned;
    save_me();
}


void set_guild_prereq( string name, string array prereq... )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_prereq = prereq;
    save_me();
}


void set_guild_allies( string name, string array allies... )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_allies = allies;
    save_me();
}


void set_guild_exclusive( string name, string array exclusive... )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_exclusive = exclusive;
    save_me();
}


void set_guild_attributes( string name, string array attributes... )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_attributes = attributes;
    save_me();
}


void set_guild_begone( string name, int begone )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_begone = begone;
    save_me();
}


void set_guild_suspend_level( string name, int suspend_level )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_suspend_level = suspend_level;
    save_me();
}


void set_guild_prospectus( string name, string prospectus )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_prospectus = prospectus;
    save_me();
}


void set_guild_sees_secret( string name, int sees_secret )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_sees_secret = sees_secret;
    save_me();
}


void set_guild_is_secret( string name, int is_secret )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_is_secret = is_secret;
    save_me();
}


void set_guild_need_all( string name, int need_all )
{
    if ( !check_previous(PRIV_NEEDED) )
	error("insufficient privilege");

    guild_check(name);
    DEFN(name)->guild_need_all = need_all;
    save_me();
}


string query_guild_title( string name )
{
    guild_check(name);
    return DEFN(name)->guild_title;
}


string array query_guild_banned( string name )
{
    guild_check(name);
    return DEFN(name)->guild_banned;
}


string array query_guild_prereq( string name )
{
    guild_check(name);
    return DEFN(name)->guild_prereq;
}


string array query_guild_allies( string name )
{
    guild_check(name);
    return DEFN(name)->guild_allies;
}


string array query_guild_exclusive( string name )
{
    guild_check(name);
    return DEFN(name)->guild_exclusive;
}


string array query_guild_attributes( string name )
{
    guild_check(name);
    return DEFN(name)->guild_attributes;
}


int query_guild_begone( string name )
{
    guild_check(name);
    return DEFN(name)->guild_begone;
}


int query_guild_suspend_level( string name )
{
    guild_check(name);
    return DEFN(name)->guild_suspend_level;
}


string query_guild_prospectus( string name )
{
    guild_check(name);
    return DEFN(name)->guild_prospectus;
}


int query_guild_sees_secret( string name )
{
    guild_check(name);
    return DEFN(name)->guild_sees_secret;
}


int query_guild_is_secret( string name )
{
    guild_check(name);
    return DEFN(name)->guild_is_secret;
}


int query_guild_need_all( string name )
{
    guild_check(name);
    return DEFN(name)->guild_need_all;
}


/* given the player's current guilds, can they join the new one? */
mixed guild_is_ok( string name, string array player_guilds )
{
    string array prereq;
    string array banned;
    string array exclusive;
    int sees_secret;

    guild_check(name);

    /* check the new guild's prerequisites against the current guilds */
    prereq = DEFN(name)->guild_prereq;
    if ( prereq )
    {
	string array common = prereq & player_guilds;

	/* do we have to have ALL the prereqs? or just one? */
	if ( DEFN(name)->guild_need_all )
	{
	    if ( sizeof(common) != sizeof(prereq) )
	    {
//### should return the missing prereqs
//### missing = prereq - common
		return "not all prerequisites have been filled";
	    }
	}
	else if ( !sizeof(common) )
	{
//### should return the list of prereqs
	    return "need to fill one of the prerequisites";
	}
    }
    else
    {
	/* initialize as empty just in case the "banned" check needs it */
	prereq = ({ });
    }

    /*
    ** If the banned list contains the single guild "all" then all guilds
    ** are banned (the player cannot be in ANY guilds except the guilds
    ** that are prerequisites).
    */
    banned = DEFN(name)->guild_banned;
    if ( sizeof(banned) && banned[0] == "all" &&
	 sizeof(player_guilds - prereq) )
    {
	return "cannot join while a member of other guilds";
    }

    exclusive = DEFN(name)->guild_exclusive;
    sees_secret = DEFN(name)->guild_sees_secret;

    foreach ( string item in player_guilds )
    {
	string * attributes;

	/* if this item is in the new guild's banned list, punt */
	if ( banned && member_array(item, banned) != -1 )
	{
	    return DEFN(item)->guild_title;
	}

	/* if the guild in question has secret attrs and we can't see them,
	   then skip it and go on to the next guild */
	if ( !sees_secret && DEFN(item)->guild_is_secret )
	    continue;

	/* if any attributes are in common between the excluded list and
	   the guild's attributes, then punt */
	attributes = DEFN(item)->guild_attributes;
	if ( exclusive && attributes && sizeof(exclusive & attributes) > 0 )
	{
	    return DEFN(item)->guild_title;
	}
    }

    return 0;
}


void define_from_file(string fname)
{
    string * lines;
    string which_guild;

    if( file_size( fname ) < 1 )
        error( fname + " is not a file." );
    lines = filter(explode(read_file(fname), "\n"),
		   (: $1[0] != '#' :));

    foreach ( string line in lines )
    {
	int idx = member_array('=', line);
	string attr;
	mixed value;

	/* hmm. malformed. just skip it -- probably blank. */
	if ( idx == -1 )
	    continue;

	attr = trim_spaces(line[0..idx-1]);
	value = trim_spaces(line[idx+1..]);

	if ( attr == "name" )
	{
	    write("Defining '" + value + "'...\n");
	    guild_add(value);
	    which_guild = value;
	    continue;
	}

	if ( !which_guild )
	    error("attribute specified before guild name\n");

	switch ( attr )
	{
	case "prospectus":
	    set_guild_prospectus(which_guild, value);
	    break;
	case "begone":
	    set_guild_begone(which_guild, to_int(value));
	    break;
	case "suspend_level":
	    set_guild_suspend_level(which_guild, to_int(value));
	    break;
	case "attributes":
	    value = map(explode(value, ","), (: trim_spaces :));
	    set_guild_attributes(which_guild, value...);
	    break;
	case "exclusive":
	    value = map(explode(value, ","), (: trim_spaces :));
	    set_guild_exclusive(which_guild, value...);
	    break;
	case "allies":
	    value = map(explode(value, ","), (: trim_spaces :));
	    set_guild_allies(which_guild, value...);
	    break;
	case "prereq":
	    value = map(explode(value, ","), (: trim_spaces :));
	    set_guild_prereq(which_guild, value...);
	    break;
	case "banned":
	    value = map(explode(value, ","), (: trim_spaces :));
	    set_guild_banned(which_guild, value...);
	    break;
	case "title":
	    set_guild_title(which_guild, value);
	    break;
	case "sees_secret":
	    set_guild_sees_secret(which_guild, to_int(value));
	    break;
	case "is_secret":
	    set_guild_is_secret(which_guild, to_int(value));
	    break;
	case "need_all":
	    set_guild_need_all(which_guild, to_int(value));
	    break;
	}
    }
}

string * query_guilds()
{
    return keys(guilds);
}