Will this work as is, and just change the send_to_char to match tba ? Or what more needs to be changed ??
Code:
in structs.h:
#define CLAN_RANK_INITIATE 1
#define CLAN_RANK_APPRENTICE 2
#define CLAN_RANK_MEMBER 3
#define CLAN_RANK_MASTER 4
#define CLAN_RANK_LEADER 5
#define GET_CLAN_NAME(ch) ((ch)->player_specials->saved.clan_name)
#define GET_CLAN_RANK(ch) ((ch)->player_specials->saved.clan_rank)
#define MAX_CLAN_LENGTH 8
-----------------------------------------------------------------------
in structs.h, struct player_special_data_saved:
char clan_name[MAX_CLAN_LENGTH+1]; /* clan info to be saved, taerin 5/30/99 */
int clan_rank; /* rank within the clan */
-----------------------------------------------------------------------
Save it in db.c, int load_char:
strcpy(psds->clan_name, ""); /* taerin: initializing clan names */
psds->clan_rank = 0; /* taerin: initializing clan ranks */
-----------------------------------------------------------------------
in db.c, int load_char, case 'C':
else if ( !strcmp(tag, "ClaN") )
strcpy( psds->clan_name, line );
else if ( !strcmp(tag, "ClaR") )
psds->clan_rank = num;
-----------------------------------------------------------------------
in db.c, void save_char:
if ( psds->clan_name )
fprintf( outfile, "ClaN: %s\n", GET_CLAN_NAME(ch) );
if ( psds->clan_rank )
fprintf( outfile, "ClaR: %d\n", (int)psds->clan_rank );
-----------------------------------------------------------------------
in act.informative.c, ACMD(do_score):
char *get_rank_name(int rank);
/* clan segment */
if ( GET_CLAN_RANK(ch) > 0 )
{
sprintf( buf, "%s %sYou are a member (%s) of the %s clan.%s\r\n\r\n",
buf, CCCYN(ch, C_NRM) ,get_rank_name(GET_CLAN_RANK(ch)),
GET_CLAN_NAME(ch), CCNRM(ch, C_NRM) );
}
-----------------------------------------------------------------------
in act.informative.c, do_who:
if ( GET_CLAN_RANK(wch) > 0 )
{
strcat( buf, CCCYN(ch, C_NRM) );
strcat( buf, " [" );
strcat( buf, GET_CLAN_NAME(wch) );
strcat( buf, "]" );
strcat( buf, CCNRM(ch, C_NRM) );
}
-----------------------------------------------------------------------
in act.wizard.c, void do_stat_character:
sprintf( buf, "Clan: [%s], Rank: [%s]\r\n",
GET_CLAN_NAME(k), get_rank_name(GET_CLAN_RANK(k)) );
send_to_char(buf, ch);
-----------------------------------------------------------------------
in interpreter.c:
ACMD(do_assign)
ACMD(do_clan);
ACMD(do_ctell);
ACMD(do_clan_tell);
{ "assign" , POS_RESTING , do_assign , LVL_IMPL, 0 },
{ "clan" , POS_SLEEPING, do_clan , 0, 0 },
{ "ctell" , POS_SLEEPING, do_clan_tell, 0, 0 },
-----------------------------------------------------------------------
in Makefile:
OBJFILES list, add clan.o
CXREF_FILES list, add clan.c
clan.o : clan.c conf.h sysdep.h structs.h utils.h comm.h db.h interpreter.h handler.h screen.h
$(CC) -c $(CFLAGS) clan.c
-----------------------------------------------------------------------
and a new file, clan.c:
/*
clan.c
wintermute mud
circlemud 3.0bpl12
ascii pfile system
taerin and riverwind 5/29/99
*/
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "db.h"
#include "interpreter.h"
#include "handler.h"
#include "screen.h"
void do_clan_who( struct char_data *ch );
void do_clan_tell( struct char_data *ch, char *msg );
void do_clan_dismiss( struct char_data *ch, struct char_data *victim );
void do_clan_enlist( struct char_data *ch, struct char_data *victim );
void do_clan_promote( struct char_data *ch, struct char_data *victim );
void do_clan_demote( struct char_data *ch, struct char_data *victim );
char *get_rank_name(int rank);
extern struct descriptor_data *descriptor_list;
/* to set up a new clan, implmentor needs to:
assign <clan> <new_leader>
*/
ACMD(do_clan)
{
struct char_data *victim = NULL;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
if ( !*GET_CLAN_NAME(ch) )
{
send_to_char( "You do not belong to any clan.\r\n", ch );
return;
}
half_chop( argument, arg1, arg2 );
if ( !*arg1 )
{
send_to_char( "Usage: clan [ who | tell | resign ]\r\n", ch );
if ( GET_CLAN_RANK(ch) == CLAN_RANK_LEADER )
{
send_to_char( "Also: clan [ enlist | dismiss | promote | demote ] victim\r\n", ch );
}
if ( GET_LEVEL(ch) == LVL_IMPL )
{
send_to_char( "Assign leaders: assign <clan> <new_leader>\r\n", ch );
}
return;
}
/* perform general level functions first */
if ( is_abbrev( arg1, "who" ) )
{
do_clan_who( ch );
return ;
}
if ( is_abbrev( arg1, "tell" ) )
{
do_clan_tell( ch, arg2 );
return ;
}
if ( is_abbrev( arg1, "resign" ) )
{
do_clan_dismiss( ch, ch );
return ;
}
/* now perform privileged functions */
if ( GET_CLAN_RANK(ch) != CLAN_RANK_LEADER )
{
send_to_char( "You do not have the authority to reorganize the clan.\r\n", ch );
return;
}
if ( !(victim = get_char_room_vis( ch, arg2 )) )
{
send_to_char( "That person is not available.\r\n", ch );
return;
}
if ( GET_LEVEL(victim) > (LVL_IMMORT - 1) )
{
send_to_char( "Immortals cannot join clans!\r\n", ch );
return;
}
if ( is_abbrev( arg1, "enlist" ) )
{
do_clan_enlist( ch, victim );
return ;
}
if ( strcmp(GET_CLAN_NAME(victim), GET_CLAN_NAME(ch)) )
{
send_to_char( "That person is not in your clan!\r\n", ch );
return;
}
if ( is_abbrev( arg1, "dismiss" ) )
{
do_clan_dismiss( ch, victim );
return ;
}
if ( is_abbrev( arg1, "promote" ) )
{
do_clan_promote( ch, victim );
return ;
}
if ( is_abbrev( arg1, "demote" ) )
{
do_clan_demote( ch, victim );
return ;
}
}
void do_clan_who( struct char_data *ch )
{
struct descriptor_data *d;
sprintf( buf, "\r\n%s%s clan members online\r\n====/=====================-%s\r\n",
CCBLU(ch, C_NRM), GET_CLAN_NAME(ch), CCNRM(ch, C_NRM) );
send_to_char( buf, ch );
for ( d = descriptor_list; d; d = d->next )
{
if (d->connected)
{
continue;
}
if ( !strcmp(GET_CLAN_NAME(d->character), GET_CLAN_NAME(ch)) )
{
sprintf( buf, "%s\r\n", GET_NAME(d->character) );
send_to_char( buf, ch );
}
}
return;
}
void do_clan_tell( struct char_data *ch, char *msg )
{
struct descriptor_data *d;
if ( GET_CLAN_RANK( ch ) < 1 )
{
send_to_char( "You need to be an initiate or higher in a clan.\r\n", ch );
return;
}
for ( d = descriptor_list; d; d = d->next )
{
if (d->connected)
{
continue;
}
if ( !strcmp(GET_CLAN_NAME(d->character), GET_CLAN_NAME(ch)) )
{
*buf = '\0';
if ( GET_NAME(d->character) == GET_NAME(ch) )
{
sprintf( buf, "%sYou tell the clan, ' %s '%s\r\n",
CCCYN(ch, C_NRM), msg, CCNRM(ch, C_NRM) );
send_to_char( buf, d->character );
}
else
{
sprintf( buf, "%s%s tells the clan, ' %s '%s\r\n",
CCCYN(ch, C_NRM), GET_NAME(ch), msg, CCNRM(ch, C_NRM) );
send_to_char( buf, d->character );
}
}
}
return;
}
void do_clan_enlist( struct char_data *ch, struct char_data *victim )
{
char lbuf[1024];
if ( !GET_CLAN_RANK(victim) )
{
strcpy(GET_CLAN_NAME(victim), GET_CLAN_NAME(ch));
GET_CLAN_RANK(victim) = CLAN_RANK_INITIATE;
*lbuf = '\0';
sprintf( lbuf, "%sWelcome the newest intitiate of %s, %s!%s",
CCRED(ch, C_NRM), GET_CLAN_NAME(ch), GET_NAME(victim), CCNRM(ch, C_NRM) );
do_clan_tell(ch, lbuf);
}
else
{
send_to_char( "That person already belongs to a clan..\r\n", ch );
}
return;
}
void do_clan_dismiss( struct char_data *ch, struct char_data *victim )
{
char lbuf[1024];
*lbuf = '\0';
sprintf( lbuf, "%s%s has been dismissed from the clan!%s",
CCRED(ch, C_NRM), GET_NAME(victim), CCNRM(ch, C_NRM) );
do_clan_tell(ch, lbuf);
strcpy(GET_CLAN_NAME(victim), "");
GET_CLAN_RANK(victim) = 0;
return;
}
void do_clan_promote( struct char_data *ch, struct char_data *victim )
{
char lbuf[1024];
if ( GET_CLAN_RANK(victim) < CLAN_RANK_MASTER )
{
GET_CLAN_RANK(victim)++;
*lbuf = '\0';
sprintf( lbuf, "%s%s has been promoted in rank to %s!%s",
CCRED(ch, C_NRM), GET_NAME(victim),
get_rank_name(GET_CLAN_RANK(victim)), CCNRM(ch, C_NRM) );
do_clan_tell(ch, lbuf);
}
else
{
send_to_char( "You can not promote this person any further.\r\n", ch );
}
return;
}
void do_clan_demote( struct char_data *ch, struct char_data *victim )
{
char lbuf[1024];
if ( GET_CLAN_RANK(victim) > CLAN_RANK_INITIATE )
{
GET_CLAN_RANK(victim)--;
*lbuf = '\0';
sprintf( lbuf, "%s%s has been demoted in rank to %s!%s",
CCRED(ch, C_NRM), GET_NAME(victim),
get_rank_name(GET_CLAN_RANK(victim)), CCNRM(ch, C_NRM) );
do_clan_tell(ch, lbuf);
}
else
{
send_to_char( "You can not demote this person any further!\r\n", ch );
}
return;
}
/* reserved for the implementor only */
ACMD(do_assign)
{
struct char_data *victim = NULL;
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
half_chop( argument, arg1, arg2 );
if ( !*arg1 || !*arg2 )
{
send_to_char( "Usage: assign <clan> <leader>\r\n", ch);
return;
}
if ( !(victim = get_char_room_vis( ch, arg2 )) )
{
send_to_char( "That person is not available.\r\n", ch );
return;
}
if ( GET_CLAN_RANK(victim) )
{
send_to_char( "Can not designate someone already in a clan!\r\n", ch);
return;
}
if ( strlen(arg1) < (MAX_CLAN_LENGTH + 1) )
{
strcpy(GET_CLAN_NAME(victim), arg1);
GET_CLAN_RANK(victim) = 5;
sprintf( buf, "Assigning clan %s to %s.\r\n", GET_CLAN_NAME(victim), GET_NAME(victim) );
send_to_char( buf, ch );
}
else
{
send_to_char( "That clan name exceeds the maximum length allowed.\r\n", ch );
}
}
char *get_rank_name(int rank)
{
switch (rank)
{
case 1: return "Initiate"; break;
case 2: return "Apprentice"; break;
case 3: return "Member"; break;
case 4: return "Master"; break;
case 5: return "Leader"; break;
default: return "Uninitiated"; break;
}
}