master.c - example for course 13

[previous example] [course 13] [Table of contents] [next example]
/* Filename      : master.c
 * Description   : the guildmaster of the example guild
 *
 * written       : 30-05-1998 - Gunner
 * last modified : 31-05-1998 - Gunner
 * HTML-Version  : 13-02-2000 - Ghorwin
 */

#include "/doc/crashcourse/course13/include/guild.h"  // All file definitions
#include "/doc/crashcourse/course13/include/master.h" // All prototypes
inherit I_DAEMON;

/*
 * join_guild : Called whenever someone tries to join the guild
 */
int
join_guild(object player)
{
    string name;

    if (!interactive(player)) // Monsters can't join!
    {
        tell_object(player,"Don't f**king try it!\n");
        return 0;
    }

    name = Q_RNAME(player);

    if (name == "guest") // Guest may NOT join!
    {  
        tell_object(player,"You are merely a guest here, so you're not "
            "allowed inside the guild. Get yourself a real player, and "
            "come back later...\n");
        return 0;
    }

    if (Q_GUILD(player)) // Only free adventurers may join...
    {
        if (Q_GUILD(player) == GUILD_MASTER)
            tell_object(player,"You're already a member, silly!\n");
        else
            tell_object(player,"You are already a member of a guild, so why "
                "not stick with it?\n");
        return 0;
    }

    if (file_size(JOIN_MSG) > 0)
        cat(JOIN_MSG);

    player->set_guild(GUILD_MASTER);
    player->set_guildinfo(0);

    // If there is a channel for the guild.

    player->command("turn on magesofdarkness");
    player->command("alias cr chat magesofdarkness:");
    player->command("alias cer chat emote magesofdarkness:");
    player->command("alias cfr chat feeling magesofdarkness:");
    player->set_title("the newbie Mage Of Darkness");
    check_member(player);
    player->save_me();
    return 1;
}

/*
 * remove_member : This is where the member loses his/her powers. Poor thing...
 */
void
remove_member(object member)
{
    member->set_guild(0);
    member->set_guildinfo(0);
    member->remove_cmdpath(GUILD_COMPATH);
    if (member->query_tmp_prop("mod_member_prot"))
    {
        member->add_tmp_prop("resist_magic",-15);
        member->add_tmp_prop("prot_magic",-15);
        member->add_tmp_prop("vuln_fire",-15);
        member->add_tmp_prop("night_vision",-50);
        member->remove_tmp_prop("mod_member_prot");
    }
    member->save_me();
}

/*
 * leave_guild : Called whenever someone leaves the guild
 */
int
leave_guild(object player)
{
    string mess;

    if (!interactive(player))
    {
        tell_object(player,"Now, how are you supposed to do that?\n");
        return 0;
    }

    if (!Q_GUILD(player))
    {
        tell_object(player,"Ehm. Someone ever told you, you're a few "
            "sandwiches short of a picnic?\n");
        return 0;
    }

    if (Q_GUILD(player) != GUILD_MASTER)
    {
        tell_object(player,"How are you going to do that? You're not even "
            "a member of this guild.\n");
        return 0;
    }

    if (file_size(LEAVE_MSG) > 0)
        cat(LEAVE_MSG);

    remove_member(player);
    return 1;
}

/*
 * check_member : Checks and adds to make sure the player is properly set up
 */
void
check_member(object member)
{
    string name = Q_RNAME(member);

    if (member_array(GUILD_COMPATH,member->query_cmdpaths()) < 0)
        member->add_cmdpath(GUILD_COMPATH);

    // Mage's Of Darkness are not very vulnerable to magic, but
    // a bit flammable. ;-) Plus they can see in darkness. 

    if (!member->query_tmp_prop("mod_member_prot"))  // Make sure it's not
    {                                                // done more than once...
        member->add_tmp_prop("resist_magic",15);
        member->add_tmp_prop("prot_magic",15);
        member->add_tmp_prop("vuln_fire",15);
        member->add_tmp_prop("night_vision",50);
        member->add_tmp_prop("mod_member_prot",1);
    }
}

/*** The rest are all applies that the mudlib calls whenever certain ***/
/*** events occur.                                                   ***/

/*
 * member_enter : Called whenever a guildmember enters the game
 */
int
member_enters(object member)
{
    if (file_size(ENTERGAME_MSG) > 0) // Display News if member hasn't read it.
    {
        int filetime = stat(ENTERGAME_MSG)[1];

        if (member->query_lastlog() < filetime)
            cat(ENTERGAME_MSG);
        else
            write("Mage Of Darkness news was last updated " + ctime(filetime) +
            ".\n");
    }

    check_member(member);

    if (!is_wiz(member)) // Move member into guildroom.
        member->move(GUILD_CENTER);

    return 1;
}

/*
 * member_exits : Called whenever a member exits the game
 */
int
member_exits(object member)
{
    if (file_size(EXITGAME_MSG) > 0)
        cat(EXITGAME_MSG);
    return 1;
}

/*
 * member_extra_look : Displayed every time someone look at the player
 */
string
member_extra_look(object member)
{
    return "This dark figure is enshrouded in a cold darkness.\n";
}

/*
 * member_finger_info : Displayed whenever someone fingers the player
 */
string
member_finger_info(string name)
{
    return "This is one of the Mages Of Darkness.\n";
}

/*
 * query_cmdpath : This should return an array of guild command paths. The 
 *                 command parser uses this info to find the guild members' 
 *                 commands.
 */
string*
query_cmdpaths()
{
    return ({ GUILD_COMPATH });
}