#include <ctype.h>
#include <stdio.h>
#ifdef SYSV
#include <unistd.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
#ifndef WINDOWS
#include <sys/errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/types.h>
#endif
#include "mush.h"
DESCRIPTOR_DATA *connectiond[5];
int outgoing[5];
char connection_names[5][5];
void
randpop (CHAR_DATA * ch, char *argy)
{
char arg1[150];
char arg2[150];
int i;
int freepos;
int pct;
int mobbie;
int objn;
DEFINE_COMMAND ("randpop", randpop, POSITION_DEAD, 110, LOG_ALWAYS, "Unfinished command... not recommended to use.")
#ifdef NEW_WORLD
argy = one_argy (argy, arg1);
argy = one_argy (argy, arg2);
if (!str_cmp (arg1, "crashtest"))
{
OBJ_PROTOTYPE *o;
o = NULL;
if (o->weight < 5)
{
fprintf (stderr, "Got here.\n");
}
}
if (arg1[0] == '\0')
{
hugebuf_o[0] = '\0';
sprintf (hugebuf_o, "Vnum %%/250 [Mob Vnums]\n\r");
sprintf (hugebuf_o + strlen (hugebuf_o), "-----------------------------------------------------------------------\n\r");
for (i = 0; i < MAX_RANDOMPOP; i++)
{
if (g_obj_pop[i] == 0)
continue;
sprintf (hugebuf_o + strlen (hugebuf_o), "%-5d %-3d %d %d %d %d %d %d %d %d %d %d\n\r",
g_obj_pop[i], g_percent[i],
g_moblist[i][0],
g_moblist[i][1],
g_moblist[i][2],
g_moblist[i][3],
g_moblist[i][4],
g_moblist[i][5],
g_moblist[i][6],
g_moblist[i][7],
g_moblist[i][8],
g_moblist[i][9]);
}
page_to_char (hugebuf_o, ch);
return;
}
if (!str_cmp (arg1, "OBJ"))
{
freepos = -1;
for (i = 0; i < MAX_RANDOMPOP; i++)
{
if (g_obj_pop[i] == 0)
{
freepos = i;
break;
}
}
if (freepos == -1)
{
send_to_char ("No more free!\n\r", ch);
return;
}
if (!is_number (arg2) || !is_number (argy))
{
send_to_char ("Must specify object vnum.\n\r", ch);
return;
}
objn = atoi (arg2);
if (objn != 0 && get_obj_index (objn) == NULL)
{
send_to_char ("That object was not found.\n\r", ch);
return;
}
pct = atoi (argy);
if (pct > 250)
{
send_to_char ("Percent can't be more than 250!\n\r", ch);
return;
}
g_obj_pop[freepos] = objn;
g_percent[freepos] = pct;
send_to_char ("All set. Use 'randpop <obj number> <mob>' to add mobs to the list.\n\r", ch);
return;
}
if (is_number (arg1))
{
int looking_for;
bool minus = FALSE;
int slot = -1;
looking_for = atoi (arg1);
if (looking_for == 0)
return;
for (i = 0; i < MAX_RANDOMPOP; i++)
{
if (g_obj_pop[i] == looking_for)
{
slot = i;
break;
}
}
if (slot == -1)
{
send_to_char ("Object not found in list.\n\r", ch);
return;
}
if (!str_cmp (arg2, "delete"))
{
g_obj_pop[slot] = 0;
send_to_char ("Deleted.\n\r", ch);
return;
}
if (arg2[0] == '-')
{
char tmp[200];
minus = TRUE;
strcpy (tmp, arg2 + 1);
strcpy (arg2, tmp);
}
if (!is_number (arg2))
return;
mobbie = atoi (arg2);
if (minus)
{
for (i = 0; i < 10; i++)
{
if (g_moblist[slot][i] == mobbie)
{
g_moblist[slot][i] = 0;
send_to_char ("Mob removed!\n\r", ch);
return;
}
}
return;
}
if (mobbie >= 10000 || get_mob_index (mobbie) == NULL)
{
send_to_char ("Mob not found or vnum above 10,000.\n\r", ch);
return;
}
for (i = 0; i < 10; i++)
{
if (g_moblist[slot][i] == 0)
{
g_moblist[slot][i] = mobbie;
send_to_char ("Mob added!\n\r", ch);
g_mobpop[mobbie] = TRUE;
return;
}
}
send_to_char ("No free slots on that object.\n\r", ch);
return;
}
#endif
return;
}
#ifndef WINDOWS
#ifdef NEED_EXTERN
extern void alarm ();
#endif
static void
alarm_handler ()
{
return;
}
int
connect_remote (char *host, char *port, CHAR_DATA * ch)
{
int sock, connectresult;
struct sockaddr_in sockaddr;
if (host[0] == '\0')
return 0;
if (isdigit (*host))
sockaddr.sin_addr.s_addr = inet_addr (host);
else
{
struct hostent *hp;
if ((hp = gethostbyname (host)) == NULL)
{
send_to_char ("Unknown host!\n\r", ch);
return 0;
}
memcpy ((char *) &sockaddr.sin_addr, hp->h_addr, sizeof (sockaddr.sin_addr));
}
if (isdigit (*port))
sockaddr.sin_port = htons (atoi (port));
else
{
send_to_char ("Must include port number!\n\r", ch);
return 0;
}
if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0)
{
fprintf (stderr, "Error!\n");
return 0;
}
sockaddr.sin_family = AF_INET;
write_to_descriptor2 (ch->desc, "Trying to connect..", 0);
if (signal (SIGALRM, alarm_handler) < 0)
{
return 0;
}
alarm (15);
connectresult = connect (sock, (struct sockaddr *) &sockaddr, sizeof (sockaddr));
alarm (0);
if (connectresult)
{
close (sock);
return 0;
}
return sock;
}
#endif
void
mudlink (CHAR_DATA * ch, char *argy)
{
int i;
char arg1[500];
char cnm[50];
#ifndef WINDOWS
DEFINE_COMMAND ("mudlink", mudlink, POSITION_DEAD, 110, LOG_ALWAYS, "This command allows you to link the god/builder channels.")
if (str_cmp ("Orin", NAME (ch)) && str_cmp("Palio",NAME(ch)) && str_cmp ("Smack", NAME (ch)))
return;
argy = one_argy (argy, cnm);
if (strlen (cnm) != 3)
{
send_to_char ("You must give a 3 letter abbreviation for the destination MUD.\n\r", ch);
return;
}
argy = one_argy (argy, arg1);
for (i = 0; i < 5; i++)
if (outgoing[i] == 0)
break;
if (i == 5)
{
send_to_char ("None free!\n\r", ch);
return;
}
outgoing[i] = connect_remote (arg1, argy, ch);
if (outgoing[i])
{
send_to_char ("Connection established! Negotiation started.\n\r", ch);
connectiond[i] = new_sdesc (outgoing[i]);
write_to_descriptor2 (connectiond[i], "\n\rNewchannel\n\r", 0);
}
cnm[0] = UPPER (cnm[0]);
cnm[1] = UPPER (cnm[1]);
cnm[2] = UPPER (cnm[2]);
strcpy (connection_names[i], cnm);
write_to_descriptor2 (connectiond[i], "&c", 0);
write_to_descriptor2 (connectiond[i], cnm, 0);
write_to_descriptor2 (connectiond[i], "\n\r", 0);
#endif
return;
}
void
read_channel_data (void)
{
FILE *fp;
CHANNEL *c;
CHANNEL *c_next;
char buf[500];
for (c = chan_first; c != NULL; c = c_next)
{
c_next = c->next;
free_m (c);
}
chan_first = NULL;
if ((fp = fopen ("channel.dat", "r")) == NULL)
{
fprintf (stderr, "Could not read channel.dat!\n");
return;
}
c = NULL;
for (;;)
{
strcpy (buf, fread_word (fp));
if (!str_cmp ("END", buf))
{
break;
}
if (!str_cmp ("#", buf))
{
fread_to_eol (fp);
continue;
}
if (!str_cmp ("NEW_CHANNEL", buf))
{
c = mem_alloc (sizeof (*c));
c->clan = FALSE;
c->clan2 = FALSE;
c->channel_name = &str_empty[0];
c->moves = 0;
c->commands[0] = NULL;
c->commands[1] = NULL;
c->commands[2] = NULL;
c->level = 0;
c->to_level = 0;
c->color = &str_empty[0];
c->to_align = SAME_ALIGN;
c->next = chan_first;
chan_first = c;
continue;
}
if (!str_cmp ("NAME", buf))
{
c->channel_name = str_dup (fread_word (fp));
continue;
}
if (!str_cmp ("LEVEL", buf))
{
c->level = fread_number (fp);
continue;
}
if (!str_cmp ("MOVES", buf))
{
c->moves = fread_number (fp);
continue;
}
if (!str_cmp ("CLAN", buf))
{
char t[20];
strcpy (t, fread_word (fp));
if (!str_cmp (t, "yes"))
c->clan = TRUE;
continue;
}
if (!str_cmp ("CLAN2", buf))
{
char t[20];
strcpy (t, fread_word (fp));
if (!str_cmp (t, "yes"))
c->clan2 = TRUE;
continue;
}
if (!str_cmp ("COMMAND", buf))
{
char cmd[40];
int i = 0;
strcpy (cmd, fread_word (fp));
while (c->commands[i])
i++;
c->commands[i] = str_dup (cmd);
continue;
}
if (!str_cmp ("COLOR", buf))
{
c->color = str_dup (fread_word (fp));
continue;
}
if (!str_cmp ("ALIGNMENT", buf))
{
char t[20];
strcpy (t, fread_word (fp));
if (!str_cmp ("both", t))
c->to_align = TO_BOTH;
if (!str_cmp ("evil", t))
c->to_align = TO_EVIL;
if (!str_cmp ("good", t))
c->to_align = TO_GOOD;
if (!str_cmp ("same", t))
c->to_align = SAME_ALIGN;
continue;
}
if (!str_cmp ("TO_LEVEL", buf))
{
c->to_level = fread_number (fp);
continue;
}
fprintf (stderr, "Unknown read in channel.dat: %s\n", buf);
fread_to_eol (fp);
}
fclose (fp);
return;
}
void
show_social (SOCIAL * s, CHAR_DATA * ch)
{
char buf[500];
int pp;
pp = ch->position;
ch->position = POSITION_STANDING;
sprintf (buf, "Social \x1B[37;1mname\x1B[37;0m: %s\n\r", s->name);
send_to_char (buf, ch);
sprintf (buf, "\x1B[37;1mTo_char\x1B[37;0m w/no arg: %s\n\r", (s->char_no_arg ? s->char_no_arg : "none"));
send_to_char (buf, ch);
sprintf (buf, "\x1B[37;1mTo_others\x1B[37;0m w/no arg: %s\n\r", (s->others_no_arg ? s->others_no_arg : "none"));
send_to_char (buf, ch);
sprintf (buf, "To char when \x1B[37;1mChar_found\x1B[37;0m: %s\n\r", (s->char_found ? s->char_found : "none"));
send_to_char (buf, ch);
sprintf (buf, "To \x1B[37;1mothers\x1B[37;0m when char found: %s\n\r", (s->others_found ? s->others_found : "none"));
send_to_char (buf, ch);
sprintf (buf, "\x1B[37;1mTo_vict\x1B[37;0m when char found: %s\n\r", (s->vict_found ? s->vict_found : "none"));
send_to_char (buf, ch);
sprintf (buf, "\x1B[37;1mChar_not\x1B[37;0m found: %s\n\r", (s->char_not_found ? s->char_not_found : "none"));
send_to_char (buf, ch);
sprintf (buf, "\x1B[37;1mChar_self\x1B[37;0m specified (to char): %s\n\r", (s->char_auto ? s->char_auto : "none"));
send_to_char (buf, ch);
sprintf (buf, "\x1B[37;1mOthers_self\x1B[37;0m specified: %s\n\r", (s->others_auto ? s->others_auto : "none"));
send_to_char (buf, ch);
ch->position = POSITION_STANDING;
return;
}