/* New Clan System Written For Asgardian Nightmare
* by Skyntil(Gabe Volker)
*/
#include "include.h"
CLN_DATA *cln_lookup(char *argument);
CLN_DATA *new_cln(void);
void free_cln(CLN_DATA *clan);
MBR_DATA *new_mbr(void);
bool remove_member(char *argument, CLN_DATA *cln);
void add_member(char *argument, CLN_DATA *clan);
void show_clans(CHAR_DATA *ch, char *argument);
void free_mbr(MBR_DATA *mbr);
MBR_DATA *mbr_lookup(char *argument, CLN_DATA *clan);
bool add_clan(char *argument);
bool remove_clan(char *argument);
CLN_DATA *cln_list; // The Clan List
CLN_DATA *cln_first; // First Clan
/* Think of it like this
* CLAN1 -> CLAN2 -> CLAN3 -> NULL(end)
* | | |
* MBR1 MBR1 MBR1
* | | |
* MBR2 MBR2 MBR2
* | | |
* NULL(end)NULL(end)NULL(end)
*/
CLN_DATA *cln_data_free;
CLN_DATA *new_cln(void)
{
CLN_DATA *nclan;
if (cln_data_free == NULL)
nclan = alloc_mem(sizeof(*nclan));
else
{
nclan = cln_data_free;
cln_data_free = cln_data_free->next;
}
nclan->next = NULL;
nclan->name = str_dup("");
nclan->members = 0;
nclan->member_first = NULL;
nclan->member_list = new_mbr();
nclan->kills = 0;
nclan->deaths = 0;
nclan->atwar = 0;
VALIDATE(nclan);
return nclan;
}
void free_cln(CLN_DATA *clan)
{
MBR_DATA *remove_mbr;
if (!IS_VALID(clan))
return;
if(clan->member_list == NULL || clan->member_first == NULL)
{
clan->next = cln_data_free;
cln_data_free = clan;
INVALIDATE(clan);
return;
}
else // With Members
{
for(remove_mbr = clan->member_first; remove_mbr != NULL; remove_mbr = remove_mbr->next)
free_mbr(remove_mbr);
free_mbr(clan->member_first);
clan->next = cln_data_free;
cln_data_free = clan;
INVALIDATE(clan);
return;
}
return;
}
MBR_DATA *mbr_data_free;
MBR_DATA *new_mbr(void)
{
MBR_DATA *nmbr;
if (mbr_data_free == NULL)
nmbr = alloc_mem(sizeof(*nmbr));
else
{
nmbr = mbr_data_free;
mbr_data_free = mbr_data_free->next;
}
nmbr->next = NULL;
nmbr->name = str_dup("");
VALIDATE(nmbr);
return nmbr;
}
void free_mbr(MBR_DATA *mbr)
{
if (!IS_VALID(mbr))
return;
mbr->next = mbr_data_free;
mbr_data_free = mbr;
INVALIDATE(mbr);
}
bool add_clan( char *argument)
{
CLN_DATA *new_clan;
new_clan = new_cln();
new_clan->name = str_dup(argument);
// Check if First Clan
if(cln_list == NULL || cln_first == NULL)
{
cln_list = new_clan; // Put into position
cln_first = cln_list; // Make it the first
}
else
{
cln_list->next = new_clan; // Point to new node
/* CLN_LIST -> NEW_CLAN */
cln_list = new_clan; // Set cln_list to current position.
/* OLD_NODE -> CLN_LIST */
}
return TRUE;
}
bool remove_clan(char *argument)
{
CLN_DATA *cln_find, *cln_found;
if((cln_found = cln_lookup(argument)) == NULL)
return FALSE;
if(cln_found == cln_first)
{
/* CLN_FND -> NEXT
* Cut found out and release it
* NEXT
*/
cln_first = cln_first->next; // Assign first to next
free_cln(cln_found);
return TRUE;
}
else if(cln_found->next == NULL) // Last
{
/* CLN_FIND -> CLN_FOUND -> NULL
* Cut found out and release it
* CLN_FIND -> NULL
*/
for(cln_find = cln_first; cln_find != NULL; cln_find = cln_find->next)
{
if(cln_find->next == cln_found)
break;
}
cln_list = cln_find; // Assign End pointer to new last
cln_list->next = NULL; // Don't point to something thats gone
free_cln(cln_found);
return TRUE;
}
else // Not the first clan
{
/* CLN_FIND -> CLN_FOUND -> NEXT
* Cut found out and release it
* CLN_FIND -> NEXT
*/
for(cln_find = cln_first; cln_find != NULL; cln_find = cln_find->next)
{
if(cln_find->next == cln_found)
break;
}
cln_find->next = cln_found->next; // Assign prev to next
free_cln(cln_found);
return TRUE;
}
return TRUE;
}
void show_clans(CHAR_DATA *ch, char *argument)
{
CLN_DATA *clan;
MBR_DATA *mbr;
char buf[256],buf2[256];
int i;
buf[0] = '\0';
buf2[0] = '\0';
if(cln_first == NULL || cln_list == NULL)
{
send_to_char("There are no clans loaded.\n\r",ch);
return;
}
for(i = 0; i < 15; i++)
strcat(buf,"=");
strcat(buf,"-NCLANS-");
for(i = 0; i < 15; i++)
strcat(buf,"=");
printf_to_char(ch,"\n\r%-30s\n\r",buf);
for(clan = cln_first; clan != NULL; clan = clan->next)
{
sprintf(buf,"| Name: %s |\n\r",clan->name);
send_to_char(buf,ch);
if(clan->member_list == NULL || clan->member_first == NULL)
send_to_char("| Members: None |\n\r",ch);
else
{
for(mbr = clan->member_first; mbr != NULL; mbr = mbr->next)
{
sprintf(buf2,"| Member: %s |\n\r",mbr->name);
send_to_char(buf2,ch);
}
}
}
buf[0] = '\0';
for(i = 0; i < 38; i++)
strcat(buf,"=");
printf_to_char(ch,"%-30s\n\r",buf);
return;
}
void add_member(char *argument, CLN_DATA *clan)
{
MBR_DATA *new_mebr;
new_mebr = new_mbr();
new_mebr->name = str_dup(argument);
if(clan->member_list == NULL || clan->member_first == NULL)
{
clan->member_list = new_mebr; // Put into position
clan->member_first = clan->member_list; // Set as First
}
else
{
clan->member_list->next = new_mebr; // Point to next node
/* MBR_LIST -> NEW_MBR */
clan->member_list = new_mebr; // Set cln_list to current position.
/* OLD_NODE -> MBR_LIST */
}
return;
}
bool remove_member(char *argument, CLN_DATA *cln)
{
MBR_DATA *mbr_find, *mbr_found;
if((mbr_found = mbr_lookup(argument,cln)) == NULL)
return FALSE;
if(mbr_found == cln->member_first)
{
/* mbr_FND -> NEXT
* Cut found out and release it
* NEXT
*/
cln->member_first = mbr_found->next; // Assign first to next
free_mbr(mbr_found);
return TRUE;
}
else if(mbr_found->next == NULL) // Last
{
/* mbr_FIND -> mbr_FOUND -> NULL
* Cut found out and release it
* mbr_FIND -> NULL
*/
for(mbr_find = cln->member_first; mbr_find != NULL; mbr_find = mbr_find->next)
{
if(mbr_find->next == mbr_found)
break;
}
cln->member_list = mbr_find; // Assign End pointer to new last
cln->member_list->next = NULL; // Don't point to something thats gone
free_mbr(mbr_found);
return TRUE;
}
else // Not the first clan
{
/* mbr_FIND -> mbr_FOUND -> NEXT
* Cut found out and release it
* mbr_FIND -> NEXT
*/
for(mbr_find = cln->member_first; mbr_find != NULL; mbr_find = mbr_find->next)
{
if(mbr_find->next == mbr_found)
break;
}
mbr_find->next = mbr_found->next; // Assign prev to next
free_mbr(mbr_found);
return TRUE;
}
return TRUE;
}
CLN_DATA *cln_lookup(char *argument)
{
CLN_DATA *nclan;
for (nclan = cln_first; nclan != NULL; nclan = nclan->next)
{
if (LOWER (argument[0]) == LOWER (nclan->name[0])
&& !str_prefix (argument, nclan->name))
return nclan;
}
return NULL;
}
MBR_DATA *mbr_lookup(char *argument, CLN_DATA *clan)
{
MBR_DATA *nmbr;
for (nmbr = clan->member_first; nmbr != NULL; nmbr = nmbr->next)
{
if (LOWER (argument[0]) == LOWER (nmbr->name[0])
&& !str_prefix (argument, nmbr->name))
return nmbr;
}
return NULL;
}
void do_nclan(CHAR_DATA *ch, char *argument)
{
char arg[MSL/10];
char arg2[MSL/10];
CLN_DATA *nclan;
if(IS_NPC(ch))
return;
argument = one_argument(argument,arg);
if(!str_cmp(arg,"show"))
{
show_clans(ch,arg);
return;
}
if(!str_cmp(arg,"add"))
{
one_argument(argument,arg);
if(!arg[0])
{
send_to_char("You must include a nclan name.\n\r",ch);
return;
}
add_clan(arg);
printf_to_char(ch,"NCLAN: %s Added.\n\r",arg);
return;
}
if(!str_cmp(arg,"remove"))
{
one_argument(argument,arg);
if(!arg[0])
{
send_to_char("You must include a nclan name.\n\r",ch);
return;
}
if(!remove_clan(arg))
{
send_to_char("There is no such clan.\n\r",ch);
return;
}
else
{
printf_to_char(ch,"NCLAN: %s Removed.\n\r",arg);
return;
}
}
if(!str_cmp(arg,"memadd"))
{
argument = one_argument(argument,arg);
one_argument(argument,arg2);
if(!arg[0])
{
send_to_char("You must include a NCLAN name.\n\r",ch);
return;
}
if((nclan = cln_lookup(arg)) == NULL)
{
send_to_char("That clan does not exist.\n\r",ch);
return;
}
if(!arg2[0])
{
send_to_char("You must include a member name.\n\r",ch);
return;
}
add_member(arg2,nclan);
printf_to_char(ch,"NCLAN: %s MEMBER: %s Added.\n\r",arg,arg2);
return;
}
if(!str_cmp(arg,"memremove"))
{
argument = one_argument(argument,arg);
one_argument(argument,arg2);
if(!arg[0])
{
send_to_char("You must include a NCLAN name.\n\r",ch);
return;
}
if((nclan = cln_lookup(arg)) == NULL)
{
send_to_char("That clan does not exist.\n\r",ch);
return;
}
if(!arg2[0])
{
send_to_char("You must include a member name.\n\r",ch);
return;
}
remove_member(arg2,nclan);
printf_to_char(ch,"NCLAN: %s MEMBER: %s Removed.\n\r",arg,arg2);
return;
}
send_to_char("Nclan [show|add|remove|memadd|memremove]\n\r",ch);
return;
}