!! note: These changes are a bit more complex than your typical snippett. The reason for this is simple, the current clan system is located in all sorts of files, and a revamp of this size is a major overhaul. Bear with me and make these changes though, and I assure you, you'll be happy with them. If you need help, email to "gary@dharvest.com" and let me know what's happening, I'll do what I can to get you fixed up and running with the new clan system. Just having the guild.dat file that can be changed without recompiling makes this all worth it. !! note: see the file "guild.dat.readme" for instructions on how to edit/modify this definition file. !! note: the functions: "is_clan", "is_same_clan" and "clan_lookup" have not been changed other than being moved, so no references to these need to be modified. also, the "clan_table" references will continue to work as they are, you only need to make the changes as listed below. ****[ MISC CHANGES ]***************************************************** !! backup! Dont make any of these changes until after you backup your source directory! !! put the "guild.c" file in your source directory. !! in "Makefile" add "guild.o" to the O_FILES section. !! add do_promote and save_guilds to interp.c and interp.h !! in "handler.c", find these two functions and delete them.. bool is_clan (CHAR_DATA *ch); bool is_same_clan (CHAR_DATA *ch, CHAR_DATA *victim); in "lookup.c" find and delete this function... int clan_lookup (const char *name); in "act_wiz.c" find and delete the "do_guild" function... ****[ CHANGES FOR FILE: tables.c ]***************************************** (1) delete the reference to clan_table. Yes, delete the entire structure. it looks like this; const struct clan_type clan_table[MAX_CLAN] = { (2) in the "various flag tables" section, add const struct flag_type guild_flags[] = { { "Independent", GUILD_INDEPENDENT, TRUE }, { "Modified", GUILD_CHANGED, FALSE }, { "Delete", GUILD_DELETED, TRUE }, { "Immortal", GUILD_IMMORTAL, TRUE }, { NULL, 0, FALSE } }; ***[ end of tables.c changes ]*** ****[ CHANGES FOR FILE: "db.c" ]***************************************** !! in the "local booting" section, add these next lines; /* load guild data file */ void load_guilds args ( (void) ); /* guilds.c */ !! in "boot_db", right before these lines; /* * Read in all the area files. */ add these next lines; /** Read in the clan/guild data file. * this must be done before we call "load_rooms" */ load_guilds(); !! ****[ CHANGES FOR FILE: "merc.h" ]*************************************** (1) at the bottom of the "Structure Types" section, add; typedef struct clan_type CLAN_DATA; (2) any logical place ( I put this above the site_ban structure ) add /** Clan flags */ #define GUILD_DELETED A #define GUILD_CHANGED B #define GUILD_INDEPENDENT C /* a "loner" guild */ #define GUILD_IMMORTAL E /* immortal only clan */ (3) in the defines section of "merc.h" after this line: #define MAX_CLAN 17 add this next line: #define MAX_RANK 6 /* guild.c */ (4) Somewhere in your /* RT personal flags */ section, add... #define PLR_MORTAL_LEADER (free slot) (of course, change 'free slot' to an open number...) (5) Add the following above the "mob_index_data" structure /* Prototypes for clan data */ typedef struct guild_rank rankdata; struct guild_rank { char *rankname; /* name of rank */ char *skillname; /* name of skill earned at this rank */ }; /* mortal leader rights are as follows; ml[0] = can_guild ml[1] = can_deguild ml[2] = can_promote ml[3] = can_demote */ struct clan_type { long flags; /* flags for guild */ char *name; /* name of guild */ char *who_name; /* name sent for "who" command */ int room[3]; /* hall/morgue/temple rooms */ rankdata rank[MAX_RANK]; /* guilds rank system */ int ml[4]; /* mortal leader rights */ }; (6) In "char_data", after the line: sh_int clan; Add this next line: sh_int rank; /* clan rank/status */ (7) in the prototypes section, delete the existing prototypes to the functions; "is_clan", "is_same_clan" and "clan_lookup" (8) in the global prototypes section, add the following after fight.c, /* guild.c */ struct clan_type clan_table[MAX_CLAN]; char * guild_bit_name args( ( int guild_flags ) ); bool is_clan args( (CHAR_DATA *ch) ); bool is_same_clan args( (CHAR_DATA *ch, CHAR_DATA *victim) ); int clan_lookup args( (const char *name) ); void do_guild args( (CHAR_DATA *ch, char *argument ) ); void do_promote args( (CHAR_DATA *ch, char *argument) ); char *player_rank args( (CHAR_DATA *ch) ); char *player_clan args( (CHAR_DATA *ch) ); bool can_guild args( (CHAR_DATA *ch) ); bool can_deguild args( (CHAR_DATA *ch) ); bool can_promote args( (CHAR_DATA *ch) ); bool can_demote args( (CHAR_DATA *ch) ); (9) under "olc.c" prototypes, add; CLAN_DATA *get_clan_data args( ( int clan ) ); (10) in the same section, after "olc.c" start a section for "olc_save.c" and include; void save_guilds args( ( CHAR_DATA *ch, char *argument ) ); char *fwrite_flag args( ( long flags, char buf[] ) ); (11) in the area for "data files used by the server" add; #define DATA_DIR "../data/" copy the included file "guild.dat" to this directory. note: if you dont want to use a data directory, that's fine, just be sure you remove the reference to "DATA_DIR" in the included files. If you're unsure of how to safely remove those references, then create the data direcotry and include the above define. ;) (12) in the OLC macro section (look for IS_BUILDER) add; #define EDIT_GUILD(Ch, Clan) ( Clan = Ch->desc->pEdit ) !! ***[ CHANGES FOR FILE "fight.c"]************************************** (1) in function "raw_kill", IF you want to move pc corpses to their clan morgue rooms, add the following to raw_kill, right after the lines; make_corpse(victim) add; /* GM, transfer the corpse to the clan morgue... */ if ( !IS_NPC(victim) && (is_clan(victim) && clan_table[victim->clan].room[1] != ROOM_VNUM_ALTAR && clan_table[victim->clan].room[1] > 0) ) { OBJ_DATA *corpse; ROOM_INDEX_DATA *morgue; corpse = get_obj_list(victim, "corpse", victim->in_room->contents ); morgue = get_room_index(clan_table[victim->clan].room[1]); /* Bug fix provided by Mat Reda. Thanks Matt! */ if (corpse != NULL && morgue != NULL) { obj_from_room(corpse); obj_to_room(corpse, morgue); if (victim->alignment > 0) act("The Creator protects this one...",victim,NULL,NULL,TO_ROOM); else act("The Lord of the Grave claims his own!",victim,NULL,NULL,TO_ROOM); } } ****[ CHANGES FOR FILE "save.c" ]************************************** !! in function "fwrite_char", after the line: fprintf( fp, "Clan %s~\n",clan_table[ch->clan].name); add these lines; if (ch->rank) fprintf( fp, "Rank %d\n", ch->rank ); !! in function "fread_char", after the line: KEY( "Race", ch->race, race_lookup(fread_string( fp ))); add this line; KEY( "Rank", ch->rank, fread_number( fp ) ); ****[ CHANGES FOR FILE "act_info.c" ]********************************** !! in function "do_score", right above the lines; if ( get_trust( ch ) != ch->level ) { sprintf( buf, "You are trusted at level %d.\n\r", get_trust( ch ) ); send_to_char( buf, ch ); } add these lines; if ( is_clan(ch) ) { sprintf( buf, "You are a %s of the %s\n\r", player_rank(ch), player_clan(ch) ); send_to_char(buf, ch); } !! (not mandatory at all) in functions do_whois and do_who (courtesy of Zanthras) if you want to show the clan name (who_name) here, remove the line; clan_table[wch->clan].who_name, and replace it with this; (is_clan(wch) || IS_SET(clan_table[wch->clan].flags,GUILD_INDEPENDENT)) ? " " : clan_table[wch->clan].who_name, ****[ CHANGES FOR FILE "act_wiz.c" ]************************************ !! in the function "do_mstat", right above the lines; if (IS_NPC(victim)) { sprintf(buf,"Count: %d Killed: %d\n\r", add these next lines; if (is_clan(victim)) { sprintf(buf, "Clan: %-25s Rank: %s\n\r", player_clan(victim), player_rank(victim)); send_to_char(buf, ch); } ****[ CHANGES FOR FILE: "act_comm.c"]*********************************** !! in the function "do_clantalk", change the very last sprintf to: (note, replace the `b and `w with your muds color codes) sprintf( buf, "`b%s %s`w: %s\n\r", player_rank(ch), ch->name, argument ); !! change the very last "for" statement to: for ( d = descriptor_list; d != NULL; d = d->next ) { if ( d->connected == CON_PLAYING && is_same_clan(ch,d->character) && !IS_SET(d->character->comm,COMM_NOCLAN) && !IS_SET(d->character->comm,COMM_QUIET) ) { send_to_char(buf, d->character); } } ****[ CHANGES FOR FILE: "magic.c" ]************************************ in function "spell_word_of_recall", right above the line: if ((location = get_room_index( ROOM_VNUM_TEMPLE)) == NULL) add this line: if ((location = get_room_index(clan_table[ch->clan].room[0] )) == NULL) ****[ CHANGES FOR FILE: "act_move.c" ]********************************* in function "do_recall", right above the line: if ( ( location = get_room_index( ROOM_VNUM_TEMPLE ) ) == NULL ) add this line: if ((location = get_room_index(clan_table[ch->clan].room[0] )) == NULL) ****[ CHANGES FOR FILE: "handler.c" ]********************************** in function "extract_char" replace the if statment; note: yours will not just be an empty statement, but I made the changes before writing this, so I no longer have the original... /* Death room is set in the clan tabe now */ if ( !fPull ) { } with the following; /* Death room is set in the clan table now */ if ( !fPull ) { /* send char to clan temple (room[2]) */ if ( is_clan(ch) && (get_room_index(clan_table[ch->clan].room[2]) != NULL) ) char_to_room(ch,get_room_index(clan_table[ch->clan].room[2])); else char_to_room(ch,get_room_index(ROOM_VNUM_TEMPLE)); return; } !! in tables.h (1) after this line, extern const struct bit_type bitvector_type[]; add this line extern const struct flag_type guild_flags[]; (2) find the declartion of "clan_table" and delete it. (in stock ROM's tables.h, this is right around the very top of the file. (3) find the definition of "clan_type" and delete it. (Yep, delete it) !! in bit.c, in "struct flag_stat_type flag_stat_table[]" section, add { guild_flags, FALSE }, !! in olc.c make the following changes; (1) in "run_olc_editor" add the following 3 lines; case ED_GUILD: gedit( d->character, d->incomm ); break; (2) in "show_commands" add the following 3 lines; case ED_GUILD: show_olc_cmds( ch, gedit_table ); break; (3) in the "Interpreter Tables" section, add; /* Guild edit command table */ const struct olc_cmd_type gedit_table[] = { { "commands", show_commands }, { "create", gedit_create }, { "flag", gedit_flags }, { "list", gedit_list }, { "ml", gedit_ml }, { "name", gedit_name }, { "whoname", gedit_whoname }, { "rank", gedit_rank }, { "rooms", gedit_rooms }, { "show", gedit_show }, { "skill", gedit_skill }, { "?", show_help }, { NULL, 0 } }; (4) in the "Interpreters" section, add; /** Function: gedit * Descr : Interprets commands sent while inside the guild editor. * : Passing appropriate commands on to editor, rest to mud. * Returns : (N/A) * Syntax : (N/A| called by do_gedit only) * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ void gedit( CHAR_DATA *ch, char *argument ) { CLAN_DATA *pClan; char command[MIL]; char arg[MIL]; int cmd; EDIT_GUILD(ch, pClan); smash_tilde( argument ); strcpy( arg, argument ); argument = one_argument( argument, command ); if ( ch->level < MAX_LEVEL -2 ) { send_to_char("Insuffecient security to modify guild data", ch); edit_done( ch ); return; } if ( !str_cmp(command, "done") ) { edit_done( ch ); return; } if ( command[0] == '\0' ) { gedit_show( ch, argument ); return; } /* Search Table and Dispatch Command. */ for ( cmd = 0; gedit_table[cmd].name != NULL; cmd++ ) { if ( !str_prefix( command, gedit_table[cmd].name ) ) { if ( (*gedit_table[cmd].olc_fun) ( ch, argument ) ) { SET_BIT( pClan->flags, GUILD_CHANGED ); return; } else return; } } /* Default to Standard Interpreter. */ interpret( ch, arg ); return; } (5) in the "const struct editor_cmd_type editor_table[] =" add; { "guild", do_gedit }, (6) right above "do_aedit" (or any other suitable location) add; /** Function: do_gedit * Descr : Places user into the guild editor. Verifying Security. * Returns : Message if improper security level. * Syntax : gedit [guild #|create] * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ void do_gedit( CHAR_DATA *ch, char *argument ) { CLAN_DATA *pClan; int value; char arg[MAX_STRING_LENGTH]; if ( IS_NPC(ch) ) return; pClan = &clan_table[1]; /* set default */ argument = one_argument(argument,arg); if ( is_number( arg ) ) { value = atoi( arg ); pClan = get_clan_data( value ); if (pClan->name[0] == '\0') { send_to_char( "That guild does not exist.\n\r", ch ); return; } } else if ( !str_cmp( arg, "create" ) ) { if ( ch->pcdata->security < 9 ) { send_to_char( "GEdit : Insuffecient security to create new guilds.\n\r", ch ); return; } gedit_create( ch, "" ); ch->desc->editor = ED_GUILD; return; } if (ch->level < MAX_LEVEL -2 ) { send_to_char("Insuffecient security to edit guilds.\n\r",ch); return; } ch->desc->pEdit = pClan; ch->desc->editor = ED_GUILD; return; } (7) Right above the "get_area_data" function, add; /** Function: get_clan_data * Descr : Returns a pointer to the clan_table of the requested clan # * Returns : (CLAN_DATA *) * Syntax : (n/a) * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ CLAN_DATA *get_clan_data( int clan ) { if ( clan <= MAX_CLAN && (clan_table[clan].name != NULL && clan_table[clan].name[0] != '\0' )) return &clan_table[clan]; return &clan_table[0]; /* null clan */ } !! in olc.h, make the following changes; (1) in the "Connected states for editor" defines, add #define ED_GUILD 6 (2) in the "Interpreter prototypes" section, add; void gedit args( ( CHAR_DATA *ch, char *argument ) ); (3) in the "Interpreter Table prototypes" section, add; extern const struct olc_cmd_type gedit_table[]; (4) in the "Editor Commands" section, add; DECLARE_DO_FUN( do_gedit ); (5) somewhere in the various "Editor prototypes" section, add; /** Guild Editor Prototypes */ DECLARE_OLC_FUN( gedit_flags ); DECLARE_OLC_FUN( gedit_rank ); DECLARE_OLC_FUN( gedit_skill ); DECLARE_OLC_FUN( gedit_show ); DECLARE_OLC_FUN( gedit_name ); DECLARE_OLC_FUN( gedit_whoname ); DECLARE_OLC_FUN( gedit_create ); DECLARE_OLC_FUN( gedit_list ); DECLARE_OLC_FUN( gedit_rooms ); DECLARE_OLC_FUN( gedit_ml ); !! in olc_act.c (1) After the line; #define AEDIT( fun ) bool fun( CHAR_DATA *ch, char *argument ) add this line; #define GEDIT( fun ) bool fun( CHAR_DATA *ch, char *argument ) (2) in the "olc_help_type help_table[] =", at the end, before the NULL, add { "guild", guild_flags, "Guild flags." }, (3) add to the end of the file; /** Guild Editor Functions. */ /** Function: gedit_flags * Descr : Sets the various flags associated with guilds. * Returns : True/False if changed. * Syntax : flags flag_id... * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_flags ) { CLAN_DATA *pClan; long value = 0; if ( argument[0] != '\0' ) { EDIT_GUILD( ch, pClan ); if ( ( value = flag_value( guild_flags, argument ) ) != NO_FLAG ) { pClan->flags ^= value; send_to_char( "Guild flag(s) toggled.\n\r", ch); return TRUE; } } send_to_char( "Syntax: flag [flag ID]\n\r" "Type '? guild' for a list of valid flags.\n\r", ch ); return FALSE; } /** Function: gedit_rank * Descr : Sets the guild rank name * Returns : True/False if changed. * Syntax : rank rank_id rank_name * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_rank ) { CLAN_DATA *pClan; char arg1[4]; EDIT_GUILD(ch, pClan); argument = one_argument(argument, arg1); if (is_number(arg1) && atoi(arg1) <= MAX_RANK) { int value; value = atoi(arg1) -1; if (argument[0] != '\0') { free_string(pClan->rank[value].rankname); pClan->rank[value].rankname = str_dup( argument ); send_to_char("Rank name changed.\n\r", ch); return TRUE; } } send_to_char("Syntax: rank rank# newname\n\r", ch); return FALSE; } /** Function: gedit_skill * Descr : Sets the skills associated with the various ranks. * Returns : True/False if changed & notice if skill dosent exist. * Syntax : skill rank_# skill_name * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_skill ) { CLAN_DATA *pClan; char arg1[4]; EDIT_GUILD(ch, pClan); argument = one_argument(argument, arg1); if (is_number(arg1) && atoi(arg1) <= MAX_RANK) { int value; value = atoi(arg1) -1; if (argument[0] != '\0') { free_string(pClan->rank[value].skillname); pClan->rank[value].skillname = str_dup( argument ); if (skill_lookup(argument) == -1) send_to_char("Notice: That skill does not exist.\n\r", ch); send_to_char("Skill changed.\n\r", ch); return TRUE; } } send_to_char("Syntax: skill rank# newskill\n\r", ch); return FALSE; } /** Function: gedit_create * Descr : Creates a new, empty guild if room is available in the array. * Returns : True/False if created * Syntax : (n/a) * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_create ) { int i = 0; for (i=1; i < MAX_CLAN; i++) /* just loop through and find an open slot */ { if (clan_lookup(clan_table[i].name) == 0) break; } if (i <= MAX_CLAN) /* open slot */ { CLAN_DATA *pClan; int x; clan_table[i].name = str_dup("New Guild"); clan_table[i].who_name = str_dup("New Guild"); for (x = 0; x < MAX_RANK; x++) { clan_table[i].rank[x].rankname = str_dup("Empty"); clan_table[i].rank[x].skillname = str_dup(""); } pClan = &clan_table[i]; /* return new clan data */ ch->desc->pEdit = pClan; send_to_char("Guild created.\n\r", ch); return TRUE; } send_to_char("No room to create a new guild. Increase MAX_CLAN\n\r", ch); return FALSE; } /** Function: gedit_list * Descr : List's all of the current guilds, including those not yet * : saved to the data file, and those marked for deletion. * Returns : list of guilds. * Syntax : (N/A) * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_list ) { char buf[MIL]; BUFFER *buffer; int i; buffer = new_buf(); sprintf(buf, "Num Guild Name Flags\n\r-----------------------------------------------\n\r"); add_buf(buffer, buf); for (i=1; i <= MAX_CLAN; i++) { if (clan_table[i].name != NULL && clan_table[i].name[0] != '\0') { sprintf(buf,"[%2d] %s\t Flags:\t[%s]\n\r", i, clan_table[i].name, flag_string( guild_flags, clan_table[i].flags ) ); add_buf(buffer, buf); } } page_to_char( buf_string(buffer), ch ); free_buf(buffer); return FALSE; } /** Function: gedit_show * Descr : Displays currently selected guild data to the screen. * Returns : (N/A) * Syntax : (N/A) * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_show ) { CLAN_DATA *pClan; char buf[MIL]; BUFFER *buffer; int i; EDIT_GUILD(ch, pClan); buffer = new_buf(); sprintf(buf, "Name : %s %s %s\n\rWho Name : %-10s\n\r", pClan->name, IS_SET(pClan->flags, GUILD_CHANGED) ? "`c[`B*`c]`w" : "", IS_SET(pClan->flags, GUILD_DELETED) ? "`RMarked for Deletion!`w" : "", pClan->who_name); add_buf(buffer, buf); sprintf(buf, "Recall Room [%-6d] Morgue Room [%-6d] Clan Temple [%-6d]\n\r\n\r", pClan->room[0], pClan->room[1], pClan->room[2]); add_buf(buffer, buf); sprintf(buf, "Flags: [%s]\n\r\n\r", flag_string( guild_flags, pClan->flags ) ); add_buf(buffer, buf); sprintf(buf, "# Rank Skill Associated with this Rank\n\r--------------------------------------------------------------\n\r"); add_buf(buffer, buf); for (i=0; i < MAX_RANK; i++) { sprintf(buf,"[%2d] %-25s %s\n\r", i+1, (pClan->rank[i].rankname != '\0') ? pClan->rank[i].rankname : "None", (pClan->rank[i].skillname != '\0') ? pClan->rank[i].skillname : ""); add_buf(buffer, buf); } add_buf(buffer,"\n\r"); sprintf(buf, "Mortal Leader Rights\n\r--------------------\n\r"); add_buf(buffer, buf); sprintf(buf,"Can Guild : %s\n\rCan Deguild : %s\n\rCan Promote : %s\n\rCan Demote : %s\n\r", (pClan->ml[0]==1) ? "True" : "False", (pClan->ml[1]==1) ? "True" : "False", (pClan->ml[2]==1) ? "True" : "False", (pClan->ml[3]==1) ? "True" : "False"); add_buf(buffer, buf); page_to_char( buf_string(buffer), ch ); free_buf(buffer); return FALSE; } /** Function: gedit_name * Descr : Changes the name of the currently selected guild. * Returns : True/False if modified * Syntax : name new_name * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_name ) { CLAN_DATA *pClan; EDIT_GUILD(ch, pClan); if ( argument[0] == '\0' ) { send_to_char( "Syntax: name [name]\n\r", ch ); return FALSE; } if (clan_lookup(argument) != 0) { send_to_char("That guild allready exists.\n\r", ch); return FALSE; } if (pClan->name[0] != '\0') free_string( pClan->name ); pClan->name = str_dup( argument ); send_to_char( "Name set.\n\r", ch ); return TRUE; } /** Function: gedit_whoname * Descr : Changes the who_name of the currently selected guild. * Returns : True/False if modified. * Syntax : whoname new_who_name * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_whoname ) { CLAN_DATA *pClan; EDIT_GUILD(ch, pClan); if ( argument[0] == '\0' ) { send_to_char( "Syntax: whoname [name]\n\r", ch ); return FALSE; } if (pClan->who_name[0] != '\0') free_string( pClan->who_name ); pClan->who_name = str_dup( argument ); send_to_char( "Who Name set.\n\r", ch ); return TRUE; } /** Function: gedit_rooms * Descr : Changes the vnum of the room(s) selected. * Returns : True/False if modified. * Syntax : rooms [hall new#|morgue new#|temple new#] * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_rooms ) { CLAN_DATA *pClan; char arg1[10], arg2[10], arg3[10], arg4[10], arg5[10], arg6[10]; bool set = FALSE; EDIT_GUILD(ch, pClan); if ( argument[0] == '\0' ) { send_to_char( "Syntax: rooms [hall #|morgue #|temple #]\n\r", ch ); return FALSE; } argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); argument = one_argument(argument, arg3); argument = one_argument(argument, arg4); argument = one_argument(argument, arg5); argument = one_argument(argument, arg6); /* kinda of convoluted, I know, but this seemed the easiest way to allow for any combination of commands. ie: hall 1 morgue 2 temple 3 morgue 2 hall 3 temple 1 or even hall 1 morgue 2 hall 1 */ if (!str_cmp(arg1,"hall") && is_number(arg2) ) { pClan->room[0] = atoi(arg2); set = TRUE; } else if (!str_cmp(arg1,"morgue") && is_number(arg2) ) { pClan->room[1] = atoi(arg2); set = TRUE; } else if (!str_cmp(arg1,"temple") && is_number(arg2) ) { pClan->room[2] = atoi(arg2); set = TRUE; } if (!str_cmp(arg3,"hall") && is_number(arg4) ) { pClan->room[0] = atoi(arg4); set = TRUE; } else if (!str_cmp(arg3,"morgue") && is_number(arg4) ) { pClan->room[1] = atoi(arg4); set = TRUE; } else if (!str_cmp(arg3,"temple") && is_number(arg4) ) { pClan->room[2] = atoi(arg4); set = TRUE; } if (!str_cmp(arg5,"hall") && is_number(arg6) ) { pClan->room[0] = atoi(arg6); set = TRUE; } else if (!str_cmp(arg5,"morgue") && is_number(arg6) ) { pClan->room[1] = atoi(arg6); set = TRUE; } else if (!str_cmp(arg5,"temple") && is_number(arg6) ) { pClan->room[2] = atoi(arg6); set = TRUE; } if (set) { send_to_char("Room(s) set.\n\r", ch); return TRUE; } return FALSE; } /** Function: gedit_ml * Descr : Changes the mortal leader settings. * Returns : True/False if modified * Syntax : ml [true/false|true/false|true/false|true/false] * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ GEDIT( gedit_ml ) { CLAN_DATA *pClan; char arg1[6], arg2[6], arg3[6], arg4[6]; bool set = FALSE; EDIT_GUILD(ch, pClan); if ( argument[0] == '\0' ) { send_to_char( "Syntax: ml TRUE|FALSE TRUE|FALSE TRUE|FALSE TRUE|FALSE\n\r", ch ); return FALSE; } argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); argument = one_argument(argument, arg3); argument = one_argument(argument, arg4); if (!str_prefix(arg1,"true") ) { pClan->ml[0] = TRUE; set = TRUE; } else if (!str_prefix(arg1, "false") ) { pClan->ml[0] = FALSE; set = TRUE; } if (!str_prefix(arg2,"true") ) { pClan->ml[1] = TRUE; set = TRUE; } else if (!str_prefix(arg2, "false") ) { pClan->ml[1] = FALSE; set = TRUE; } if (!str_prefix(arg3,"true") ) { pClan->ml[2] = TRUE; set = TRUE; } else if (!str_prefix(arg3, "false") ) { pClan->ml[2] = FALSE; set = TRUE; } if (!str_prefix(arg4,"true") ) { pClan->ml[3] = TRUE; set = TRUE; } else if (!str_prefix(arg4, "false") ) { pClan->ml[3] = FALSE; set = TRUE; } if (set) { send_to_char("Mortal Leader traits set.\n\r", ch); return TRUE; } return FALSE; } !! In "olc_save.c", add the following function. /** Function: save_guilds * Descr : Writes the clan_table to /data/guild.dat file. * Returns : (N/A) * Syntax : (N/A) * Written : v1.0 3/98 * Author : Gary McNickle <gary@dharvest.com> */ void save_guilds(CHAR_DATA *ch, char *argument) { FILE *fp; int i; int value; char buf[MSL]; sprintf(buf, "%sguild.dat", DATA_DIR); if ( !( fp = fopen(buf, "w+" ) ) ) { bug( "Open_guild: fopen", 0 ); return; } for (i=1; clan_lookup(clan_table[i].name) != 0; i++) { if ( !IS_SET(clan_table[i].flags, GUILD_DELETED) && clan_lookup(clan_table[i].name) != 0) { fprintf(fp, "\nGuild\t%s~\n", clan_table[i].name); fprintf(fp, "Who\t%s~\n", clan_table[i].who_name); fprintf(fp, "Rooms\t%d\t%d\t%d\n", clan_table[i].room[0], clan_table[i].room[1], clan_table[i].room[2]); for (value=0; value < MAX_RANK; value++) { if (clan_table[i].rank[value].rankname == NULL || clan_table[i].rank[value].rankname[0] == '\0') clan_table[i].rank[value].rankname = str_dup("Unassigned"); fprintf(fp, "Rank\t%d\t%s~\n", value+1, clan_table[i].rank[value].rankname); } for (value=0; value < MAX_RANK; value++) if (clan_table[i].rank[value].skillname != NULL && clan_table[i].rank[value].skillname[0] != '\0') fprintf(fp, "Skill\t%d\t%s~\n", value+1, clan_table[i].rank[value].skillname); fprintf(fp, "ML\t%d %d %d %d\n", clan_table[i].ml[0], clan_table[i].ml[1], clan_table[i].ml[2], clan_table[i].ml[3]); /* Remove "changed" bit before writing flags to file */ if (IS_SET(clan_table[i].flags, GUILD_CHANGED)) REMOVE_BIT(clan_table[i].flags, GUILD_CHANGED); fprintf( fp, "Flags %s \n", fwrite_flag( clan_table[i].flags, buf ) ); fprintf(fp, "\n"); } } fprintf(fp, "\nEnd\n"); fclose(fp); send_to_char("Guild data file (guild.dat) written.\n\r", ch); return; } ***************************** END OF CHANGES ************************** That should do it for ya. Recompile, and if you have any problems, let me know, I'll do what I can to help you get them straightened out. --Gary Keep in mind that so far, this has all been done as a basic guild system, it's my hope that with the changes made, updating and adding to this will be much easier than before. There are many applications that can be done with guilds, this should give you a solid foundation to build on. [clan-2.0/install.fresh, 3/27/98, Gary McNickle, gary@dharvest.com]