player/a/
player/b/
player/c/
player/d/
player/e/
player/f/
player/g/
player/i/
player/j/
player/k/
player/m/
player/n/
player/r/
player/s/
player/v/
player/w/
player/x/
player/z/
player_fst/e/
player_fst/f/
player_fst/h/
player_fst/i/
player_fst/j/
player_fst/n/
player_fst/o/
player_fst/p/
player_fst/player/a/
player_fst/player/b/
player_fst/player/c/
player_fst/player/d/
player_fst/player/e/
player_fst/player/f/
player_fst/player/g/
player_fst/player/j/
player_fst/player/k/
player_fst/player/m/
player_fst/player/n/
player_fst/player/r/
player_fst/player/s/
player_fst/player/v/
player_fst/player/w/
player_fst/player/x/
player_fst/player/z/
player_fst/u/
player_fst/v/
player_fst/w/
player_fst/x/
/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 ~  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        ~
 ~  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   ~
 ~                                                                         ~
 ~  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          ~
 ~  Chastain, Michael Quan, and Mitchell Tse.                              ~
 ~                                                                         ~
 ~  Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley              ~
 ~  ACK!MUD is modified Merc2.0/2.1/2.2 code (c)Stephen Zepp 1998 Ver: 4.3 ~
 ~                                                                         ~
 ~  In order to use any part of this  PA  Diku Mud, you must comply with   ~
 ~  both the original Diku license in 'license.doc' as well the Merc       ~
 ~  license in 'license.txt', and the Ack!Mud license in 'ack_license.txt'.~
 ~  In particular, you may not remove any of these copyright notices.      ~
 ~                                                                         ~
 ~           _______      _____                                            ~
 ~          /  __  /\    / ___ \       222222        PA_MUD by Amnon Kruvi ~
 ~         /______/ /   / /___\ \            2       PA_MUD is modified    ~
 ~        / _______/   / _______ \           2       Ack!Mud, v4.3         ~
 ~       /_/          /_/       \_\        2                               ~
 ~                                      2                                  ~
 ~                                     2222222                             ~
 ~                                                                         ~
 ~                                                                         ~
 ~   Years of work have been invested to create DIKU, Merc, Ack and PA.    ~
 ~   Please show your respect by following the licenses, and issuing       ~
 ~   credits where due.                                                    ~
 ~                                                                         ~
 ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-*/

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ack.h"
#include "config.h"

void do_alliances( CHAR_DATA *ch, char *argument )
{
	char buf[MSL];
	int i,x=0,j;
	bool all = FALSE;
	bool sort = TRUE;
	int ord[MAX_ALLIANCE];

	if ( !str_cmp(argument,"all") )
		all = TRUE;

	for ( i=0;i<MAX_ALLIANCE;i++ )
		ord[i] = i;
	if ( sort )
	{
		for ( i=0;i<MAX_ALLIANCE;i++ )
		{
			for ( x=0;x<i;x++ )
			{
				if ( alliance_table[ord[i]].kills > alliance_table[ord[x]].kills )
				{
					j = ord[x];
					ord[x] = ord[i];
					ord[i] = j;
					i--;
					break;
				}
			}
		}
	}

	x = 1;
	send_to_char( "\n\r@@W   Leader       @@g|@@W  Members  @@g|@@W  Kills  @@g|@@W  Name@@g\n\r", ch );
	for ( j = 0;j < MAX_ALLIANCE;j++ )
	{
		i = ord[j];
		if ( alliance_table[i].name == NULL )
			break;
		if ( alliance_table[i].members <= 1 && !all )
			continue;
		buf[0] = '\0';
		if ( IS_IMMORTAL(ch) )
			sprintf(buf,"%2d. ", i );
		sprintf( buf+strlen(buf), "@@g[@@W%-10s@@g] |   [@@W%3d@@g]   |  [@@W%3d@@g]  @@W|@@N  %s@@g\n\r", 
			alliance_table[i].leader, 
			alliance_table[i].members, 
			alliance_table[i].kills,
			alliance_table[i].name );
		x++;
		send_to_char( buf, ch );
	}
	send_to_char("Proposed alliances:\n\r #  |Name           Leader          Supporters\n\r", ch);
        buf[0] = '\0';
	for(i=0;i<MAX_ALLIANCE;i++)
	{
		if(!strcmp(palliance_table[i].name, ""))
			break;
    		sprintf(buf, "@@g[@@W%2d@@g][@@W%-13s@@g][@@W%-13s@@g][@@W%s, %s@@g]\n\r", i, palliance_table[i].name, palliance_table[i].leader, palliance_table[i].support[0], palliance_table[i].support[1]);
		send_to_char(buf, ch);
	}
	return;
}

void do_awhere( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *wch;
	char buf[MSL];
	char loc[MSL];

	if ( ch->pcdata->alliance == -1 )
	{
		send_to_char( "You are not a member of an alliance.\n\r", ch );
		return;
	}
	sprintf( buf, "@@WMembers of@@N %s@@N:\n\r", alliance_table[ch->pcdata->alliance].name );
	for ( wch = first_char;wch;wch = wch->next )
	{
		if ( ch->pcdata->alliance == wch->pcdata->alliance )
		{
			sprintf( loc, "%3d/%-3d", wch->x, wch->y );

			sprintf( buf+strlen(buf), "@@W%-15s @@d- @@a%s @@R[@@e%s@@R] %s%s%s @@e%3d@@c/@@R%-3d HP   @@bFighting@@c: @@y%3s@@N\n\r", wch->name, loc, planet_table[wch->z].name, (wch->in_building)?"@@c(@@a":"", (wch->in_building)?wch->in_building->name:"", (wch->in_building)?"@@c)":"", wch->hit, wch->max_hit, (wch->fighttimer>0)?"Yes":"No" );
		}
	}
	send_to_char( buf, ch );
	return;
}
void do_accept( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char buf[MSL];

	if ( argument[0] == '\0' )
	{
		send_to_char( "Syntax: accept <person>\n\r        accept emergency\n\r", ch );
		return;
	}
	if ( !str_cmp(argument,"emergency") )
	{
		int i;

		if ( ch->pcdata->alliance != -1 )
		{
			send_to_char( "You are already a member of an alliance.\n\r", ch );
			return;
		}
		for ( i = 0;i < 99999;i++ )
		{
			if ( alliance_table[i].name == NULL )
				break;
			if ( !str_cmp(ch->name,alliance_table[i].leader) )
			{
				ch->pcdata->alliance = i;
				send_to_char( "You have regained membership of your alliance.\n\r", ch );
				alliance_table[i].members++;
				return;
			}
		}
		send_to_char( "You are not the leader of any alliance!\n\r", ch );
		return;
	}

	if ( ch->pcdata->alliance == -1 )
	{
		send_to_char( "You are not a part of an alliance.\n\r", ch );
		return;
	}
	if ( ( victim = get_char_room(ch,argument) ) == NULL )
	{
		send_to_char( "You can't find that person.\n\r", ch );
		return;
	}
	if ( victim->pcdata->alliance != -1 )
	{
		send_to_char( "They are already a member of another alliance.\n\r", ch );
		return;
	}
	sprintf( buf, "You insert $N's data to %s's member database.\n\r", alliance_table[ch->pcdata->alliance].name );
	act( buf, ch, NULL, victim, TO_CHAR );
	sprintf( buf, "$n grabs a small computer, and inserts your data to %s's member database.\n\r", alliance_table[ch->pcdata->alliance].name );
	act( buf, ch, NULL, victim, TO_VICT );
	sprintf( buf, "$n grabs a small computer, and inserts $N's data to %s's member database.\n\r", alliance_table[ch->pcdata->alliance].name );
	act( buf, ch, NULL, victim, TO_NOTVICT );
	victim->pcdata->alliance = ch->pcdata->alliance;
	alliance_table[ch->pcdata->alliance].members++;
	save_alliances();
	return;
}

void do_leave( CHAR_DATA *ch, char *argument )
{
	if ( ch->pcdata->alliance == -1 )
	{
		send_to_char( "You are not in alliance, how can you leave it?\n\r", ch );
		return;
	}
	if ( !ch->in_building || ch->in_building->type != BUILDING_HQ )
	{
		send_to_char( "You must be in your headquarters to leave an alliance.\n\r", ch );
		return;
	}
	if (!str_cmp(alliance_table[ch->pcdata->alliance].leader,ch->name) )
	{
		send_to_char( "You can't leave your own alliance. Use Setowner to give it to someone else.\n\r", ch );
		return;
	}
	act( "You use your Headquarters' computer to remove your data from your alliance's database.", ch, NULL, NULL, TO_CHAR );
	act( "$n uses $s Headquarters' computer to remove $mself from $s alliance's database.", ch, NULL, NULL, TO_ROOM );
	alliance_table[ch->pcdata->alliance].members--;
	save_alliances();
	ch->pcdata->alliance = -1;
	return;
}

void do_aban( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;
	char buf[MSL];

	if ( ch->pcdata->alliance == -1 )
	{
		send_to_char( "You are not a part of an alliance.\n\r", ch );
		return;
	}
	if ( argument[0] == '\0' )
	{
		send_to_char( "Ban whom?\n\r", ch );
		return;
	}
	if ( ( victim = get_char_world(ch,argument) ) == NULL )
	{
		send_to_char( "You can't find that person.\n\r", ch );
		return;
	}
	if ( victim->pcdata->alliance != ch->pcdata->alliance )
	{
		send_to_char( "They are not a member of your alliance.\n\r", ch );
		return;
	}
	alliance_table[ch->pcdata->alliance].members--;
	save_alliances();
	sprintf( buf, "You remove $N's data from %s's member database.\n\r", alliance_table[ch->pcdata->alliance].name );
	act( buf, ch, NULL, victim, TO_CHAR );
	victim->pcdata->alliance = -1;
	return;
}

void do_amem( CHAR_DATA *ch, char *argument )
{
	char buf[MSL];
	int alliance;

	if ( ch->pcdata->alliance == -1 )
	{
		send_to_char( "You are not a part of an alliance.\n\r", ch );
		return;
	}
	if ( is_number(argument) && IS_IMMORTAL(ch) )
		alliance = atoi(argument) - 1;
	else
		alliance = ch->pcdata->alliance;
	sprintf(buf,"fgrep -lx 'Alliance     %d' %s*/*", alliance, PLAYER_DIR); /**/
	do_pipe(ch, buf);
	return;
}

char *fgetf( char *s, int n, register FILE *iop )
{
    register int c;
    register char *cs;
    
    c = '\0';
    cs = s;
    while( --n > 0 && (c = getc(iop)) != EOF)
    {
        if ((*cs++ = c) == '\0')
            break;
    }

    *cs = '\0';
    return((c == EOF && cs == s) ? NULL : s);
}
void do_pipe( CHAR_DATA *ch, char *argument )
{
    char buf[MSL];
    FILE *fp;

#if defined (unix)
    fp = popen( argument, "r" );
#endif

#if defined ( WIN32 )
	fp = _popen(argument, "r" );
#endif

    fgetf( buf, MSL, fp );

    if ( ch && ch != NULL )
        send_to_char( buf, ch );


#if defined (unix)
    pclose( fp );
#endif
#if defined ( WIN32 )
	_pclose (fp);
#endif

    return;
}

void do_createalliance(char leader[20], char *argument)
{
    int i;
	char *name_nocol, *name_nocol2;
	CHAR_DATA *ch;
	DESCRIPTOR_DATA d;
	bool found;

	smash_tilde(argument);
	smash_swear(argument);
	name_nocol = str_dup(strip_color(argument,"@@"));
	strcat(argument,"@@N");
	for ( i = 0;i< MAX_ALLIANCE;i++ )
	{
		if ( alliance_table[i].name == NULL || alliance_table[i].members == 0)
		{
			if ( alliance_table[i].members == 0)
			{
				char file[MSL]; //Erase board data
				BOARD_DATA *board;
				sprintf( file, "boards/board.%d", OBJ_VNUM_ALLI_BOARD + i );
				for ( board = first_board;board;board = board->next )
				{
					if ( board->vnum == OBJ_VNUM_ALLI_BOARD + i )
					{
						MESSAGE_DATA *msg;
						MESSAGE_DATA *msg_next;
						for ( msg = board->first_message;msg;msg = msg_next )
						{
							msg_next = msg->next;
							UNLINK(msg, board->first_message, board->last_message, next, prev);
							PUT_FREE(msg, message_free);
						}
					break;
					}
				}
				unlink(file);
			}
			if ( alliance_table[i].name != NULL )
				free_string(alliance_table[i].name);
			if ( alliance_table[i].leader != NULL )
				free_string(alliance_table[i].leader);
			alliance_table[i].leader = str_dup(leader);
			alliance_table[i].name = str_dup(argument);
			alliance_table[i].members = 1;
			alliance_table[i].kills = 0;
			leader[0] = UPPER(leader[0]);
			if((ch = get_ch(leader)) != NULL && !strcmp(leader, ch->name))
				ch->pcdata->alliance = i;
			else {
				found = load_char_obj( &d, leader, FALSE );
				if(!found)
				{
					log_f("Creating alliance for non-existant leader.\n\r");
					free_string(name_nocol);
					save_alliances();
					free_char(d.character);
					return;
				}
				ch = d.character;
				ch->desc == NULL;
				d.character = NULL;
				ch->fake = TRUE;
				ch->pcdata->alliance = i;
				save_char_obj(ch);
				free_char(ch);
			}
			free_string(name_nocol);
			save_alliances();
			return;
		} else {
			name_nocol2 = str_dup(strip_color(alliance_table[i].name,"@@"));
			if ( !str_cmp(name_nocol2,name_nocol) )
			{
				log_f("The alliance already exists.\n\r");
				free_string(name_nocol);
				free_string(name_nocol2);
				return;
			}
			if ( !str_cmp(alliance_table[i].leader,ch->name) )
			{
				log_f("A leader of one alliance tried to create a new.\n\r");
				free_string(name_nocol);
				free_string(name_nocol2);
				return;
			}
		}
		free_string(name_nocol2);
	}
	free_string(name_nocol);
	free_string(name_nocol2);
	log_f("No alliance slot found.\n\r");
	return;
}

void do_setowner( CHAR_DATA *ch, char *argument )
{
	int i = ch->pcdata->alliance;
	DESCRIPTOR_DATA d;
	CHAR_DATA *wch;
	bool load = FALSE;

	if ( i == -1 )
	{
		send_to_char( "You are not a member of an alliance, not to mention leader.\n\r", ch );
		return;
	}
	if ( str_cmp(alliance_table[i].leader,ch->name) )
	{
		send_to_char( "You are not the leader of this alliance.\n\r", ch );
		return;
	}
	if ( ( wch = get_char_world(ch,argument) ) == NULL )
	{
		bool found = FALSE;

		found = load_char_obj( &d, argument, FALSE );
		if ( !found )
		{
			send_to_char( "No such player.\n\r", ch );
			free_char(d.character);
			return;
		}
		wch = d.character;
		d.character = NULL;
		wch->desc = NULL;
		load = TRUE;
//		send_to_char( "That person is not online.\n\r", ch );
//		return;
	}
	if ( wch->pcdata->alliance != i )
	{
		send_to_char( "The person must be a member of your alliance.\n\r", ch );
		if ( load )
		{
			free_char(wch);
			wch = NULL;
		}
		return;
	}
	free_string(alliance_table[i].leader);
	alliance_table[i].leader = str_dup(capitalize(wch->name));
	if ( load )
	{
		free_char(wch);
		wch = NULL;
		send_to_char( "Ok.\n\r", ch );
		return;
	}
	send_to_char( "Ok.\n\r", ch );
	send_to_char( "You have been set as the leader of your alliance.\n\r", wch );
	return;
}
void do_alliprop( CHAR_DATA *ch, char *argument )
{
    int i = ch->pcdata->alliance;
    int x;
    char buf[MSL];
    if(i != -1)
    {
	send_to_char("You have to leave your current alliance before proposing another one.\n", ch);
	return;
    }
    
    if(!strcmp(argument, ""))
    {
	send_to_char("Syntax: alliprop <title>\n\r", ch);
    	return;
    }

    if(strcmp(palliance_table[MAX_ALLIANCE-1].name, ""))
    {
	send_to_char("Another alliance can't be proposed at this time. Try again later.\n\r", ch);
        return;
    }

    for(x=0;x < MAX_ALLIANCE;x++)
    {
	if(!strcmp(palliance_table[x].name, ""))
	    break;
	if(!strcmp(palliance_table[x].leader, ch->name))
	{
	    send_to_char("You can not propose more than one alliance at a time.\n\r", ch);
	    return;
	}
    }
    
    strcpy(palliance_table[x].name, argument);
    strcpy(palliance_table[x].leader, ch->name);
    strcpy(palliance_table[x].support[0], "None");
    strcpy(palliance_table[x].support[1], "None");
    sprintf(buf, "The alliance %s has been proposed in slot %d\n", argument, x);
    send_to_char(buf, ch);
    return;
}

void save_palliance()
{
    FILE *fp;
    int i;

    if((fp = fopen(PALLIANCES_FILE, "w")) == NULL)
    {
	printf("Can't open PALLIANCES_FILE, %s", PALLIANCES_FILE);
	exit(0);
    }
    
    for(i=0;i<MAX_ALLIANCE;i++)
    {
	if(!strcmp(palliance_table[i].name, ""))
	   break;
	fputs(palliance_table[i].name, fp); fputs("\n", fp);
	fputs(palliance_table[i].leader, fp); fputs("\n", fp);
	fputs(palliance_table[i].support[0], fp); fputs("\n", fp);
	fputs(palliance_table[i].support[1], fp); fputs("\n", fp);
    }
    
    fprintf(fp, "#DONE");
    fclose(fp);
    return;
}

void load_palliance()
{
	FILE *fp;
	int i;

	log_f("Loading %s\n\n", PALLIANCES_FILE);

	if((fp = fopen(PALLIANCES_FILE, "r")) == NULL)
	{
		log_f("Can't open PALLIANCES_FILE, %s\n", PALLIANCES_FILE);
		exit(0);
	}

	for(i=0;i<MAX_ALLIANCE;i++)
	{
		fgets(palliance_table[i].name, MSL, fp);
		if(!strncmp(palliance_table[i].name, "#DONE", 5))
		{
			strcpy(palliance_table[i].name, "");
			break;
		}
                palliance_table[i].name[strlen(palliance_table[i].name)-1] = '\0';

		fgets(palliance_table[i].leader, MSL, fp);
		if(!strncmp(palliance_table[i].leader, "#DONE", 5))
		{
			log_f("Incomplete PALLIANCE data. Please correct.");
			exit(0);
		}
                palliance_table[i].leader[strlen(palliance_table[i].leader)-1]= '\0';

                fgets(palliance_table[i].support[0], MSL, fp);
                if(!strncmp(palliance_table[i].support[0], "#DONE", 5))
                {
                        log_f("Incomplete PALLIANCE data. Please correct.");
                        exit(0);
                }
                palliance_table[i].support[0][strlen(palliance_table[i].support[0])-1] = '\0';

		fgets(palliance_table[i].support[1], MSL, fp);
		if(!strncmp(palliance_table[i].support[1], "#DONE", 5))
		{
			log_f("Incomplete PALLIANCE data. Please correct.");
			exit(0);
		}
                palliance_table[i].support[1][strlen(palliance_table[i].support[1])-1] = '\0';

	}
	return;
}	

void do_allisupport(CHAR_DATA *ch, char *argument)
{
	int x;
	
	if(!strcmp(argument, ""))
	{
		send_to_char("Syntax: allisupport ##  (ex: allisupport 25)\n\r", ch);
		return;
	}

	if(!(isdigit((int) argument[0]) && isdigit((int) argument[1])))
	{
		send_to_char("Syntax: allisupport ##  (ex: allisupport 25)\n\r", ch);
		return;
	}
	
	x = atoi(argument);
	if(!strcmp(palliance_table[x].leader, ch->name))
	{
		send_to_char("You are the leader, you already lent your support.\n\r", ch);
		return;
	}
	
	if(strcmp(palliance_table[x].support[0], "None")) // If someone is already supporting this alliance
	if(strcmp(palliance_table[x].support[1], "None"))
	{
		send_to_char("No more support needed. If you see this, contact an immortal.", ch);
		return;
	} else 
	if(strcmp(palliance_table[x].support[0], ch->name))
	{
		strcpy(palliance_table[x].support[1], ch->name);
		do_createalliance(palliance_table[x].leader, palliance_table[x].name);
		for( ;x < MAX_ALLIANCE-1;x++)
		{
			strcpy(palliance_table[x].name, palliance_table[x+1].name);
			strcpy(palliance_table[x].leader, palliance_table[x+1].leader);
			strcpy(palliance_table[x].support[0], palliance_table[x+1].support[0]);
			strcpy(palliance_table[x].support[1], palliance_table[x+1].support[1]);
		}
		palliance_table[MAX_ALLIANCE].name[0] = '\0';
		palliance_table[MAX_ALLIANCE].leader[0] = '\0';
		strcpy(palliance_table[MAX_ALLIANCE].support[0], "None");
		strcpy(palliance_table[MAX_ALLIANCE].support[1], "None");
	} else {
		send_to_char("You already support this alliance!\n\r", ch);
		return;
	}
	else
		strcpy(palliance_table[atoi(argument)].support[0], ch->name);

	send_to_char("You have lent your support to that alliance.\n\r", ch);
	return;
}