/
vortex/area/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"

CLAN_DATA *find_clan_name(char *argument);
int get_clan_nw(CLAN_DATA *clan);
bool is_clan_leader(CHAR_DATA *ch);
bool is_clan_coleader(CHAR_DATA *ch);

void load_clans()
{
 FILE *fp;
 char *word;
 CLAN_DATA *clan;

 int idnum = 1;
 int i;

 if( (fp = fopen(CLAN_FILE, "r")) == NULL)
 {
  bug("Could not open clan file for read.", 0);
  return;
 }
 word = fread_string(fp);
 while( str_cmp(word,"#END"))
 {
  if( !str_cmp(word, "#CLAN")) 
  {
   CREATE(clan, CLAN_DATA, 1);
   CREATE(clan->fort, FORTRESS_DATA, 1);
   clan->name = fread_string(fp);
   clan->leader = fread_string(fp);
   clan->coleader = fread_string(fp);
   clan->kills = fread_number(fp);
   clan->deaths = fread_number(fp);
   clan->points = fread_number(fp);
   clan->id_num = idnum;
   idnum++;
   clan->channel = fread_string(fp);
   for( i = 0; i < 11; i++)
    clan->rank_name[i] = fread_string(fp);
   clan->fort->level = fread_number(fp);
   clan->fort->max_turrets = fread_number(fp);
   clan->fort->max_tanks = fread_number(fp);
   clan->fort->tanks = fread_number(fp);
   clan->fort->turrets = fread_number(fp);
   clan->fort->spies = fread_number(fp);
   for( i = 0; i < 4; i++)
    clan->fort->wall_str[i] = fread_number(fp);
   for( i = 0; i < 4; i++)
    clan->fort->wall_cond[i] = fread_number(fp);
   clan->fort->upper_vnum = fread_number(fp);
   clan->fort->lower_vnum = fread_number(fp);
   clan->fort->recall_vnum = fread_number(fp);
   LINK(clan, clan_list, last_clan, next, prev);
   word = fread_string(fp);
  }
 }
 fclose(fp);
 return;
}

void save_clans()
{
 FILE *fp;
 CLAN_DATA *clan;
 int i;

 if( (fp = fopen(CLAN_FILE, "w")) == NULL)
 {
  bug("Could not open clanfile for writing.\n\r", 0);
  return;
 }
 for(clan = clan_list; clan != NULL; clan = clan->next)
 {
  fprintf(fp, "#CLAN~\n");
  fprintf(fp, "%s~\n", clan->name);
  fprintf(fp, "%s~\n", clan->leader);
  fprintf(fp, "%s~\n", clan->coleader);
  fprintf(fp, "%d ", clan->kills);
  fprintf(fp, "%d ", clan->deaths);
  fprintf(fp, "%d\n", clan->points);
  fprintf(fp, "%s~\n", clan->channel);
  for( i = 0; i < 11; i++)
   fprintf( fp, "%s~\n", clan->rank_name[i]);
  fprintf(fp, "%d ", clan->fort->level);
  fprintf(fp, "%d ", clan->fort->max_turrets);
  fprintf(fp, "%d ", clan->fort->max_tanks);
  fprintf(fp, "%d ", clan->fort->tanks);
  fprintf(fp, "%d ", clan->fort->turrets);
  fprintf(fp, "%d\n", clan->fort->spies);
  for( i = 0; i < 4; i++)
   fprintf( fp, "%d ", clan->fort->wall_str[i]);
  fprintf( fp, "\n");
  for( i = 0; i< 4; i++)
   fprintf(fp, "%d ", clan->fort->wall_cond[i]);
  fprintf(fp, "\n");
  fprintf(fp, "%d %d %d\n", clan->fort->upper_vnum, clan->fort->lower_vnum, clan->fort->recall_vnum);
 }
 fprintf(fp, "#END~");
 fclose(fp);
 return;
}

bool is_clan_leader(CHAR_DATA *ch)
{
 CLAN_DATA *clan;
 bool ret_val = FALSE;

 for( clan = clan_list; clan != NULL; clan = clan->next)
 {
  if( !str_cmp(ch->name, clan->leader))
   ret_val = TRUE;
 }
 return ret_val;
}

bool is_clan_coleader(CHAR_DATA *ch)
{
 CLAN_DATA *clan;
 bool ret_val = FALSE;

 for( clan = clan_list; clan != NULL; clan = clan->next)
 {
  if( !str_cmp( ch->name, clan->coleader))
   ret_val = TRUE;
 }
 return ret_val;
}

CLAN_DATA *find_clan_name(char *argument)
{
 CLAN_DATA *clan;
 CLAN_DATA *ret_clan = NULL;
 for(clan = clan_list; clan != NULL; clan = clan->next)
 {
  if( !str_cmp( clan->name, argument))
   ret_clan = clan;
 }
 return ret_clan;
}

void register_kill( CHAR_DATA *ch, CHAR_DATA *victim)
{
 CLAN_DATA *kill_clan;
 CLAN_DATA *death_clan;
 int points;

 kill_clan = find_clan_name(ch->clan);
 death_clan = find_clan_name(victim->clan);

 if( victim->race)
  points = victim->race;
 if( victim->race == 0)
  points = 1;
 if( kill_clan != NULL)
 {
  kill_clan->kills++;
  if( is_clan_leader(victim))
   points = (victim->race * 2);
  if( is_clan_coleader(victim))
   points = (victim->race * 1.5);
  kill_clan->points += points;
 }
 if( death_clan != NULL)
  death_clan->deaths++;
 save_clans();
 return;
}

void do_setleader(CHAR_DATA *ch, char *argument)
{
 CLAN_DATA *clan;
 CHAR_DATA *victim;
 char arg[MAX_INPUT_LENGTH];

 argument = one_argument( argument, arg);

 if( IS_NPC(ch))
  return;
 if( arg[0] == '\0')
 {
  stc("Set WHO as a clan leader.\n\r", ch);
  return;
 }
 if( (victim = get_char_world(ch, arg)) == NULL)
 {
  stc("Set WHO as a clan leader.\n\r", ch);
  return;
 } 
 if( (clan = find_clan_name(victim->clan)) == NULL)
 {
  stc("That clan does not exist.\n\r", ch);
  return;
 }
 clan->leader = str_dup(victim->pcdata->switchname);
 stc("Done.\n\r", ch);
 stc("You are now a clan leader.\n\r", victim);
 save_clans();
 return;
}

void do_setcoleader(CHAR_DATA *ch, char *argument)
{
 CLAN_DATA *clan;
 CHAR_DATA *victim;
 char arg[MAX_INPUT_LENGTH];
  
 argument = one_argument( argument, arg);
  
 if( IS_NPC(ch))
  return;
 if( arg[0] == '\0')
 {
  stc("Set WHO as a clan co-leader.\n\r", ch);
  return;
 }
 if( (victim = get_char_world(ch, arg)) == NULL)
 {
  stc("Set WHO as a clan co-leader.\n\r", ch);
  return;
 }
 if( IS_NPC(victim))
  return;
 if( (clan = find_clan_name(victim->clan)) == NULL)
 {
  stc("That clan does not exist.\n\r", ch);
  return;
 }
 clan->coleader = str_dup(victim->pcdata->switchname);
 stc("Done.\n\r", ch);
 stc("You are now a clan co-leader.\n\r", victim);
 save_clans();
 return;
}

void do_clantable(CHAR_DATA *ch, char *argument)
{
 CLAN_DATA *clan;
 char buf[MAX_STRING_LENGTH];

 if( IS_NPC(ch))
  return;
 stc("|    Name    |   Leader   |  Coleader  | Kills | Deaths | Points |\n\r", ch);
 stc("------------------------------------------------------------------\n\r", ch);
 for( clan = clan_list; clan != NULL; clan = clan->next)
 {
  sprintf(buf, "|%12s %12s %12s %7d %8d %8d|\n\r", clan->name, clan->leader, clan->coleader,
          clan->kills, clan->deaths, clan->points);
  stc(buf, ch);
 }
 return;
}

void do_makeclan(CHAR_DATA *ch, char *argument)
{
 CLAN_DATA *clan;
 CLAN_DATA *master;
 bool found = FALSE;
 int i;

 char arg[MAX_INPUT_LENGTH];
 one_argument(argument, arg);

 if(IS_NPC(ch))
  return;
 if( arg[0] == '\0')
 {
  stc("Make what clan.\n\r", ch);
  return;
 }
 for( master = clan_list; master != NULL; master = master->next)
 {
  if( !str_cmp(master->name,argument))
   found = TRUE;
 }
 if( found)
 {
  stc("That clan already exists.\n\r", ch);
  return;
 }
 CREATE(clan, CLAN_DATA, 1);
 CREATE(clan->fort, FORTRESS_DATA, 1);
 clan->name = str_dup(capitalize(arg));
 clan->leader = NULL;
 clan->coleader = NULL;
 clan->fort->name = NULL;
 clan->fort->max_turrets = 0;
 clan->fort->max_tanks = 0;
 clan->fort->turrets = 0;
 clan->fort->spies = 0;
 clan->fort->tanks = 0;
 clan->fort->level = 1;
 clan->fort->wall_str[0] = 0;
 clan->fort->wall_str[1] = 0;
 clan->fort->wall_str[2] = 0;
 clan->fort->wall_str[3] = 0;
 clan->fort->wall_cond[0] = 0;
 clan->fort->wall_cond[1] = 0;
 clan->fort->wall_cond[2] = 0;
 clan->fort->wall_cond[3] = 0;
 clan->kills = 0;
 clan->points = 0;
 clan->deaths = 0;
 clan->channel = NULL;
 for( i = 0; i < 11; i++)
  clan->rank_name[i] = NULL;
 LINK(clan, clan_list, last_clan, next, prev);
 save_clans();
 return;
}

void do_delclan(CHAR_DATA *ch, char *argument)
{
 CLAN_DATA *master = NULL;
 CLAN_DATA *deleted = NULL;
 /* yes this is hackish looking...get over it*/

 char arg[MAX_INPUT_LENGTH];

 one_argument( argument, arg);

 if(IS_NPC(ch))
  return;
 if( arg[0] == '\0')
 {
  stc("Delete which clan?\n\r", ch);
  return;
 }
 for( master = clan_list; master != NULL; master = master->next)
 {
  if( !str_cmp(argument, master->name))
   deleted = master;
 }
 if( deleted == NULL)
 {
  stc("That is not a valid clan.\n\r", ch);
  return;
 }
 sprintf(arg, "Clan %s deleted by %s", deleted->name,
    ch->pcdata->switchname);
 log_string(arg);
 UNLINK(deleted, clan_list, last_clan, next, prev);
 DISPOSE(deleted);
 save_clans();
 return;
}

void show_clan(CHAR_DATA *ch, CLAN_DATA *clan)
{
 char buf[MAX_STRING_LENGTH];
 FORTRESS_DATA *fort;

 fort = clan->fort;
 stc("--------------------------------------------------------------\n\r",ch);
 sprintf(buf,"Clan: %10s  Points: %8d   Leader: %15s\n\r",
       clan->name, clan->points, clan->leader);
 stc(buf, ch);
 sprintf(buf, "Kills: %5d  Deaths: %5d           Coleader: %15s\n\r",
        clan->kills, clan->deaths, clan->coleader);
 stc(buf, ch);
 sprintf( buf, "Channel: %15s\n\r", clan->channel);
 stc(buf, ch);
 sprintf( buf, "Wall strength: %d/%d %d/%d %d/%d %d/%d\n\r",
       fort->wall_cond[0], fort->wall_str[0], fort->wall_cond[1],
       fort->wall_str[1], fort->wall_cond[2], fort->wall_str[2],
       fort->wall_cond[3], fort->wall_str[3]);
 stc(buf, ch);
 sprintf( buf, "Tanks %d    Turrets %d      Spies %d\n\r",
       fort->tanks, fort->turrets, fort->spies);
 stc(buf, ch);
return;
}

void do_show_clan(CHAR_DATA *ch, char *argument)
{
 CLAN_DATA *clan;
 char arg[MAX_INPUT_LENGTH];
 
 one_argument(argument, arg);
 if( IS_NPC(ch))
  return;
 if( ch->clan == NULL)
 {
  stc("You don't have a clan to show.\n\r", ch);
  return;
 }
 clan = find_clan_name(ch->clan);
 if( clan == NULL)
 {
  stc("Your clan doesn't seem to exist.\n\r", ch);
  return;
 }
 show_clan(ch, clan);
 return;
}

void do_spyclan(CHAR_DATA *ch, char *argument)
{
 char arg[MAX_INPUT_LENGTH];
 CLAN_DATA *clan;
 CLAN_DATA *spy;
 int chance = 50;

 one_argument(argument, arg);
 
 if( IS_NPC(ch))
  return;
 if( arg[0] == '\0')
 {
  stc("Spy on which clan.\n\r", ch);
  return;
 }
 if( ch->clan == NULL)
 {
  stc("You must belong to a clan to spy on a clan.\n\r", ch);
  return;
 }
 spy = find_clan_name(ch->clan);
 if( spy == NULL)
 {
  stc("Your clan doesnt seem to exist.\n\r", ch);
  return;
 }
 if(spy->fort->spies < 1)
 {
  stc("Your clan doesnt have any spies to send.\n\r", ch);
  return;
 }
 if( ch->clan_rank < 5)
 {
  stc("You must reach at least rank 5 in  your clan to send spies.\n\r", ch);
  return;
 }
 if( (clan = find_clan_name(argument)) == NULL)
 {
  stc("That clan doesnt seem to exist.\n\r", ch);
  return;
 }
 if( spy->fort->spies > clan->fort->spies)
  chance += 5;
 else
  chance -= 5;
 chance += number_range(-5, 5);
 if( number_range(1,100) > chance)
 {
  if( number_range(1,100) > 75)
  {
   stc("Your spy was killed by the enemy!\n\r", ch);
   sprintf( arg, "#1%s#n has killed a #1%s#n spy!", clan->name, spy->name);
   do_info(ch, arg);
   spy->fort->spies -= 1;
   return;
  }
  else
  {
   stc("Your spy failed to learn anything about the enemy.\n\r", ch);
   return;
  }
 }
 else
 {
  stc("Your spy learned the following about the enemy clan:\n\r", ch);
  show_clan(ch, clan);
  return;
 }
 return;
}

void clan_attack(CHAR_DATA *ch,CLAN_DATA *attacker, CLAN_DATA *defender)
{
 int att_str;
 int def_str;
 int att_loss;
 int def_loss;
 bool win = FALSE;
 char buf[MAX_STRING_LENGTH];
 int damage;
 int dam_loc = number_range(0,3);

 if( attacker == NULL || defender == NULL)
 {
  log_string("Null attacker or defender in clan_attack.");
  return;
 }
 if( attacker->fight_timer != 0)
 {
  stc("Your army is already out on conquest.\n\r", ch);
  return;
 }
 attacker->fight_timer += 20;
 att_str = attacker->fort->tanks;
 att_str *= 2;
 def_str = defender->fort->turrets;
 def_str *= 3;
 att_loss = attacker->fort->tanks;
 att_loss *= (number_range(10,25)/100);
 def_loss = defender->fort->turrets;
 def_loss *= (number_range(8,20)/100);
 if( att_str > def_str)
  win = TRUE;
 if( win && number_range(1,100) < 25)
  win = FALSE;
 if( win)
 {
  sprintf(buf, "%s has won a battle against %s, they destroyed %d turrets, but lost %d tanks.",
   attacker->name, defender->name, att_loss, def_loss);
  do_info(ch, buf);
  defender->fort->wall_cond[dam_loc] -= damage;
 }
 else
 {
  sprintf(buf, "%s attempted to attack %s's clan fortress but was repelled.", attacker->name,
   defender->name);
  do_info(ch, buf);
  sprintf(buf, "%s lost %d tanks and %s lost %d turrets.", attacker->name, att_loss, 
      defender->name, def_loss);
  do_info(ch, buf);
 }
 attacker->fort->tanks -= att_loss;
 defender->fort->turrets -= def_loss;
 save_clans();
 return;
}

void do_clan_attack(CHAR_DATA *ch, char *argument)
{
 CLAN_DATA *attacker;
 CLAN_DATA *defender;
 int att_nw = 0;
 int def_nw = 0;
 char arg[MAX_INPUT_LENGTH];
 one_argument(argument, arg);

 if( IS_NPC(ch))
  return;
 if( arg[0] == '\0')
 {
  stc("Attack which clan?\n\r", ch);
  return;
 }
 if( (attacker = find_clan_name(ch->name)) == NULL)
 {
  stc("Your clan doesnt seem to exist.\n\r", ch);
  return;
 }
 if( (defender = find_clan_name(argument)) == NULL)
 {
  stc("That clan doesnt seem to exist.\n\r", ch);
  return;
 }
 if( ch->clan_rank < 3)
 {
  stc("You must have at least rank 3 in your clan to initiate attacks.\n\r", ch);
  return;
 }
 att_nw = get_clan_nw(attacker);
 def_nw = get_clan_nw(defender);
 if( def_nw < (att_nw * 0.7))
 {
  stc("They are much to small for your clan to attack.\n\r", ch);
  return;
 }
 if( def_nw > (att_nw * 1.3))
 {
  stc("Are you crazy!? They would stomp you.\n\r", ch);
  return;
 }
 clan_attack(ch, attacker, defender);
 return;
}

int get_clan_nw(CLAN_DATA *clan)
{
  int value = 0;
  int i;

  value += (clan->fort->turrets * 3);
  value += (clan->fort->tanks * 2);
  for( i = 0; i < 4; i++);
   value += (clan->fort->wall_str[i] * 5);
  value += (clan->fort->level * 3);
  
  return value;
}

void do_setclan(CHAR_DATA *ch, char *argument)
{
 CLAN_DATA *clan;
 char arg1[MAX_INPUT_LENGTH];
 char arg2[MAX_INPUT_LENGTH];
 char arg3[MAX_INPUT_LENGTH];
 int value, cost;

 argument = one_argument( argument, arg1);
 argument = one_argument( argument, arg2);
 argument = one_argument( argument, arg3);

 if( IS_NPC(ch))
  return;
 if( ch->clan == NULL)
 {
  stc("You aren't in a clan.\n\r", ch);
  return;
 }
 if( (clan = find_clan_name(ch->clan)) == NULL)
 {
  stc("Your clan doesnt seem to exist.\n\r", ch);
  return;
 }
 if( !is_clan_leader(ch))
 {
  stc("Only clan leaders can modify their clan.\n\r", ch);
  return;
 }
 if( arg1[0] == '\0')
 {
  stc("Set what?\n\r", ch); 
  stc("Syntax: setclan rank <rank number> <rank name>\n\r", ch);
  stc("        setclan buy turrets <amount>.\n\r", ch);
  stc("        setclan buy tanks <amount>.\n\r", ch);
  stc("        setclan buy walls.\n\r", ch);
  stc("        setclan buy upgrade.\n\r", ch);
  return;
 }  

 if( arg2[0] == '\0')
 {
  stc("Set it to what?\n\r", ch);
  return;
 }
 if( !str_cmp( arg1, "rank"))
 {
  if( !is_number(arg2))
  {
   stc("Must supply a value from 1 to 10.\n\r", ch);
   return;
  }
  value = atoi(arg2);
  value -= 1; /* to covert from natural numbers to computer numbers*/
  if( (value < 0) || (value > 9))
  {
   stc("Value must be between 1 and 10.\n\r", ch);
   return;
  }
  if( arg3[0] == '\0')
  {
   stc("Set it to what?\n\r", ch);
   return;
  }
  if( str_len(arg3) > 15)
  {
   stc("Rank names can only be 15 characters long.\n\r", ch);
   return;
  }
  STRFREE(clan->rank_name[value]);
  smash_color(arg3);
  clan->rank_name[value] = str_dup(arg3);
  save_clans();
  stc("Done.\n\r", ch);
  return;
 }
 if( !str_cmp(arg1, "buy"))
 {
  if( !str_cmp(arg2, "tanks"))
  {
   cost = 20;
   if( arg3[0] == '\0')
    value = 1;
   if( is_number(arg3))
    value = atoi(arg3);
   cost = cost * value;
   if( clan->points < cost)
   {
    stc("Your clan can't afford that many tanks.\n\r", ch);
    return;
   }
   clan->points -= cost;
   clan->fort->tanks += value;
   return;
  }
  else if( !str_cmp( arg2, "turrets"))
  {
   cost = 15;
   if( arg3[0] == '\0')
    value = 1;
   if( is_number(arg3))
    value = atoi(arg3);
   cost = cost * value;
   if( clan->points < cost)
   {
    stc("Your clan can't afford that many turrets.\n\r", ch);
    return;
   }
   clan->points -= cost;
   clan->fort->turrets += value;
   save_clans();
   return;
  }
  else if( !str_cmp(arg2, "walls"))
  {
   cost = (clan->fort->wall_str[0] * 20);
   if( clan->fort->wall_str[0] > ((clan->fort->level) * 50))
   {
    stc("Your walls are already as strong as they can get for your current fortress type.\n\r", ch);
    return;
   }
   if( clan->points < cost)
   {
    stc("Your clan doesnt have the prestige to build stronger walls.\n\r", ch);
    return;
   }
   for( value = 0; value < 4; value++)
    clan->fort->wall_str[value] += 10;
   clan->points -= cost;
   save_clans();
   stc("Your clan walls have been strengthened.\n\r", ch);
   return;
  }
  else if( !str_cmp( arg2, "upgrade"))
  {
   cost = ((clan->fort->level+1) * 1000);
   if( cost > clan->points)
   {
    stc("You have yet to gain the prestige to upgrade your fortress.\n\r", ch);
    return;
   }
   if( clan->fort->wall_str[0] < (50 * (clan->fort->level)))
   {
    stc("The walls of your fortress must be fully upgraded.\n\r", ch);
    return;
   }
   if( clan->fort->level == 10)
   {
    stc("Your fortress has already ascended to space.\n\r", ch);
    return;
   }
   clan->points -= cost;
   clan->fort->level++;
   save_clans();
   return;
  }
  else
  {
   stc("Syntax: setclan buy <turrets,tanks,walls,upgrade> <amount>\n\r", ch);
   return;
  }
 }
 else
 {
  stc("Syntax: setclan rank <rank name>\n\r", ch);
  stc("        setclan buy turrets <amount>.\n\r", ch);
  stc("        setclan buy tanks <amount>.\n\r", ch);
  stc("        setclan buy walls.\n\r", ch);
  stc("        setclan buy upgrade.\n\r", ch);
  return;
 }
 return;
}

void do_induct( CHAR_DATA *ch, char *argument)
{
 CHAR_DATA *victim;
 char arg1[MAX_INPUT_LENGTH];
 char arg2[MAX_INPUT_LENGTH];
 char arg3[MAX_INPUT_LENGTH];

 argument = one_argument(argument, arg1);
 argument = one_argument(argument, arg2);
 argument = one_argument(argument, arg3);

 if( IS_NPC(ch))
  return;
 if( !is_clan_leader(ch) && !is_clan_coleader(ch))
 {
  stc("Yout must be a clan leader ot co-leader.\n\r", ch);
  return;
 }
 if( arg1[0] == '\0')
 {
  stc("Induct who?\n\r", ch);
  return;
 }
 if( arg2[0] == '\0')
 {
  stc("Accept, banish, or rank who?.\n\r", ch);
  return;
 }
 if( (victim = get_char_room(ch, arg1)) == NULL)
 {
  stc("They are not here.\n\r", ch);
  return;
 }
 if( !str_cmp( arg2, "accept"))
 {
  if( (victim->clan != NULL) && (str_len(victim->clan) > 4))
  {
   stc("They are already clanned.\n\r", ch);
   return; 
  }
  STRFREE(victim->clan);
  victim->clan = str_dup(ch->clan);
  stc("You have been inducted into a clan.\n\r", victim);
  stc("You have accepted a new memeber to your clan.\n\r", ch);
  victim->clan_rank = 10;
  do_save(victim, "auto");
 }
 else if( !str_cmp( arg2, "banish"))
 {
  if( str_cmp(victim->clan, ch->clan))
  {
   stc("You can't banish someone not in your clan.\n\r", ch);
   return;
  }
  if( is_clan_leader(victim))
  {
   stc("You can't banish the leader.\n\r", ch);
   return;
  }
  STRFREE(victim->clan);
  victim->clan = str_dup("");
  stc("You have been banished from your clan.\n\r", victim);
  act("$N has been banished from your clan.", ch, NULL, victim, TO_CHAR);
  return;
 }
 else if( !str_cmp(arg2,"rank") )
 {
  if( str_cmp(victim->clan,ch->clan) )
  {
   stc("You can't rank someone not in your clan.\n\r", ch);
   return;
  }
 } 
 return;
} 

void do_clan_recall( CHAR_DATA *ch, char *argument )
{
 ROOM_INDEX_DATA *location;
 CHAR_DATA *mount;
 CLAN_DATA *clan;
 FORTRESS_DATA *fort;
 
 clan = find_clan_name(ch->clan);
 if( clan != NULL )
  fort = clan->fort;       
 act("$n's body flickers with red energy.",ch,NULL,NULL,TO_ROOM);
 act("Your body flickers with red energy.",ch,NULL,NULL,TO_CHAR);

 if( clan == NULL )
 {
  stc("You don't even have a clan!\n\r",ch);
  return;
 }
 if( (location = get_room_index(fort->recall_vnum) ) == NULL )
 {
  stc("Your clan's recall hasn't been set.\n\r", ch );
  return;
 }
 if( ch->in_room == location )
  return;
 if( in_arena(ch) )
 {
  stc("You can't recall from the arena.\n\r",ch);
  return;
 }
 if( (IS_AFFECTED(ch,AFF_CURSE) || (IS_SET(ch->in_room->room_flags,ROOM_NO_RECALL) && ch->in_room->vnum != 25734)) && ch->level > 2 )
 {
  stc("You are unable to recall.\n\r",ch);
  return;
 }
 act("$n disappears in a red stream of light!",ch,NULL,NULL,TO_ROOM);
 char_from_room(ch);
 char_to_room(ch,location);
 act("$n appears in the room.",ch,NULL,NULL,TO_ROOM);
 do_look(ch,"auto");
 if( (mount = ch->mount) == NULL )
  return;
 char_from_room(mount);
 char_to_room(mount,ch->in_room);
 return;
}