/***************************************************************************
* 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. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* EotS 1.3 is copyright 1993-1996 Eric Orvedal and *
* Nathan Axtman *
* EotS has been brought to you by us, the merry drunk mudders *
* Kjodo *
* Torann *
* Sledge *
* Nicodemous *
* Tom *
* By using this code, you have agreed to follow the terms of the *
* blood oath of the carungatang *
* *
* FUBAR WAR CODE *
* I think you will enjoy :) (Ugh...480 lines [more now :)] ) *
* *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
void do_declare(CHAR_DATA *ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char arg4[MAX_INPUT_LENGTH];
DESCRIPTOR_DATA *d;
CLAN_DATA *pClan = NULL;
CLAN_DATA *dClan= NULL;
int num = 0;
war.team_red = 0;
war.team_blue = 0;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
argument = one_argument(argument, arg3);
argument = one_argument(argument, arg4);
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
send_to_char(C_DEFAULT, "Syntax: declare <type> <min_level> <max_level>\n\r", ch);
return;
}
if (atoi(arg1) < 1 || atoi(arg1) > 3)
{
send_to_char(C_DEFAULT, "The type either has to be 1, 2, or 3.\n\r",
ch);
return;
}
if (atoi(arg2) <= 0 || atoi(arg2) > 113)
{
send_to_char(C_DEFAULT, "Level must be between 1 and 113.\n\r", ch);
return;
}
if (atoi(arg3) <= 0 || atoi(arg3) > 113)
{
send_to_char(C_DEFAULT, "Level must be between 1 and 113.\n\r", ch);
return;
}
if (atoi(arg3) < atoi(arg2))
{
send_to_char(C_DEFAULT, "Max level must be greater than the min level.\n\r", ch);
return;
}
if (war.iswar == TRUE)
{
send_to_char(C_DEFAULT, "There is already a war going!\n\r", ch);
return;
}
if (atoi(arg1) == 3 && arg4[0] == '\0')
{
send_to_char(C_DEFAULT, "You must supply a clan to challenge for clan war.\n\r", ch);
send_to_char(C_DEFAULT, "Use clans to find the appropriate clan's number.\n\r", ch);
return;
}
if (atoi(arg1) == 3)
{
num = is_number( arg4 ) ? atoi( arg4 ) : -1;
if ( num == -1 )
{
send_to_char( AT_WHITE, "No such clan exists, please try again.\n\r", ch );
send_to_char( AT_WHITE, "Type clans to see available clan names.\n\r", ch );
return;
}
if (!(pClan = get_clan_index(num)))
{
send_to_char( AT_WHITE, "Illegal clan number, please try again.\n\r", ch );
send_to_char( AT_WHITE, "Type clans to see available clan numbers.\n\r", ch );
return;
}
if (!(dClan = get_clan_index(ch->clan)))
{
send_to_char(C_DEFAULT, "You must be in a clan to make a clan war challenge.\n\r", ch);
return;
}
}
war.iswar = TRUE;
war.wartype = atoi(arg1);
war.min_level = atoi(arg2);
war.max_level = atoi(arg3);
if (war.wartype == 3)
{
war.clan_chlng = ch->clan;
war.clan_accpt = num;
}
if(war.wartype != 3)
sprintf(buf, "&c%s &Rwar started for levels &Y%d &Rto &Y%d&R. Type"
"'WAR' to kill or be killed", war.wartype == 1 ? "Single" : "Team",
war.min_level, war.max_level);
else
sprintf(buf, "&Y%s &Rchallenges &Y%s&rto clan war. Levels &Y%d &Rto &Y%d&R. Type"
"'WAR' to kill or be killed", dClan->name, pClan->name, war.min_level, war.max_level);
info( buf, 0, 0 );
war.timeleft = 5;
for (d = descriptor_list; d != NULL; d = d->next)
{
if (!IS_NPC(d->character))
{
if (IS_SET(d->character->act2, PLR_WAR))
REMOVE_BIT(d->character->act2, PLR_WAR);
}
}
}
void do_war(CHAR_DATA *ch, char *argument)
{
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH];
char arg[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *location;
location = get_room_index(9);
argument = one_argument(argument, arg);
if (war.iswar != TRUE)
{
send_to_char(C_DEFAULT, "There is no war going!\n\r", ch);
return;
}
if (!str_cmp( arg, "reset"))
{
if (war.timeleft < 1 && ch->level < 108)
{
send_to_char(C_DEFAULT, "You cannot reset a running war.\n\r", ch);
return;
}
sprintf(buf, "War reset by an admin.");
info(buf, 0, 0);
war.iswar = FALSE;
war.timeleft = 0;
war.count = 0;
war.min_level = 0;
war.max_level = 0;
war.wartype = 0;
war.inwar = 0;
for( d = descriptor_list; d != NULL; d = d->next )
{
if (IS_SET(d->character->act2, PLR_WAR))
{
char_from_room(d->character);
char_to_room(d->character, (get_room_index(ROOM_VNUM_TEMPLE)));
do_look(d->character, "auto");
}
}
return;
}
if (ch->level < war.min_level || ch->level > war.max_level)
{
send_to_char(C_DEFAULT, "Sorry, you can't join this war.\n\r", ch);
return;
}
if (IS_SET(ch->act2, PLR_WAR))
{
send_to_char(C_DEFAULT, "I don't think so.\n\r", ch);
return;
}
if (war.wartype == 1)
{
/* if ((location = get_room_index(SINGLE_WAR_WAITING_ROOM)) == NULL)
{
send_to_char(C_DEFAULT, "Arena is not yet completed, sorry.\n\r", ch);
return;
}
else
{ */
act(C_DEFAULT, "$n has joined the war!", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
SET_BIT(ch->act2, PLR_WAR);
sprintf(buf, "&c%s &R(&cLevel &Y%d&R) joins the war!", ch->name, ch->level);
info(buf, 0, 0);
act(C_DEFAULT, "$n arrives to get $s &Rass&w whipped!", ch, NULL, NULL, TO_ROOM);
war.inwar++;
do_look(ch, "auto");
return;
/* } */
}
if(war.wartype == 2)
{
if( war.team_red <= war.team_blue )
{
act(C_DEFAULT, "$n has joined the &Rred team&c!", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
SET_BIT(ch->act2, PLR_WAR);
SET_BIT(ch->act2, TEAM_RED);
sprintf(buf, "&c%s &R(&cLevel &Y%d&R) joins the &Rred team&c!", ch->name, ch->level);
info(buf, 0, 0);
act(C_DEFAULT, "$n arrives to get $s &Rass&w whipped!", ch, NULL, NULL, TO_ROOM);
war.inwar++;
war.team_red++;
do_look(ch, "auto");
return;
}
else
{
act(C_DEFAULT, "$n has joined the &Bblue team&c!", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
SET_BIT(ch->act2, PLR_WAR);
SET_BIT(ch->act2, TEAM_BLUE);
sprintf(buf, "&c%s &R(&cLevel &Y%d&R) joins the &Bblue team&c!", ch->name, ch->level);
info(buf, 0, 0);
act(C_DEFAULT, "$n arrives to get $s &Rass&w whipped!", ch, NULL, NULL, TO_ROOM);
war.inwar++;
war.team_blue++;
do_look(ch, "auto");
return;
}
}
if(war.wartype == 3)
{
if( ch->clan == war.clan_chlng )
{
act(C_DEFAULT, "$n has joined the &Rred team&c!", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
SET_BIT(ch->act2, PLR_WAR);
SET_BIT(ch->act2, TEAM_RED);
sprintf(buf, "&c%s &R(&cLevel &Y%d&R) joins the &Rred team&c!", ch->name, ch->level);
info(buf, 0, 0);
act(C_DEFAULT, "$n arrives to get $s &Rass&w whipped!", ch, NULL, NULL, TO_ROOM);
war.inwar++;
war.team_red++;
do_look(ch, "auto");
return;
}
else if( ch->clan == war.clan_accpt )
{
act(C_DEFAULT, "$n has joined the &Bblue team&c!", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, location);
SET_BIT(ch->act2, PLR_WAR);
SET_BIT(ch->act2, TEAM_BLUE);
sprintf(buf, "&c%s &R(&cLevel &Y%d&R) joins the &Bblue team&c!", ch->name, ch->level);
info(buf, 0, 0);
act(C_DEFAULT, "$n arrives to get $s &Rass&w whipped!", ch, NULL, NULL, TO_ROOM);
war.inwar++;
war.team_blue++;
do_look(ch, "auto");
return;
}
else
{
send_to_char(C_DEFAULT, "You cannot join this war. You are not in the appropriate clan.\n\r", ch );
return;
}
}
}
void war_update(void)
{
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
ROOM_INDEX_DATA *random;
if (war.timeleft > 0)
{
sprintf(buf, "%d tick%s left to join the war.", war.timeleft, war.timeleft == 1 ? "" : "s");
info(buf, 0, 0);
sprintf(buf, "%d %s %s fighting in the war, so far.", war.inwar, war.inwar == 1 ? "person" : "people", war.inwar == 1 ? "is" : "are");
info(buf, 0, 0);
sprintf(buf, "Type of war: &Y%d &R- &Y%d&R, &C%s war&R.&w", war.min_level, war.max_level, war.wartype == 1 ? "Single" : "Team");
info(buf, 0, 0);
war.timeleft--;
return;
}
if (war.timeleft == 0 && war.iswar == TRUE && war.count == 0)
{
if (war.inwar == 0 || war.inwar == 1)
{
sprintf(buf, "Not enough people for war. War reset.");
info(buf, 0, 0);
war.iswar = FALSE;
war.timeleft = 0;
war.count = 0;
war.min_level = 0;
war.max_level = 0;
war.wartype = 0;
for(d = descriptor_list; d != NULL; d = d->next)
{
if (IS_SET(d->character->act2, PLR_WAR))
{
char_from_room(d->character);
char_to_room(d->character, (get_room_index(ROOM_VNUM_TEMPLE)));
do_look(d->character, "auto");
}
}
}
else
{
sprintf(buf, "The battle begins! %d players are fighting!", war.inwar);
info(buf, 0, 0);
war.count = 20;
for(d = descriptor_list; d != NULL; d = d->next)
{
if (IS_SET(d->character->act2, PLR_WAR))
{
random = get_room_index(number_range(7350, 7365));
char_from_room(d->character);
char_to_room(d->character, random);
do_look(d->character, "auto");
}
}
}
}
return;
}