#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;
}