#include <ctype.h>
#include <stdio.h>
#include "com_room.h"
#include "socket.h"
#include "stringops.h"
static char word [128], output[1024];
static room *command_exit_roomfind (globals *g, player *p, char *l)
{
room *r;
#ifdef FUNCTIONS
puts ("**command_exit_roomfind");
#endif
if (!strlen (l))
return NULL;
if (*l == '*')
{
r = g->room_current;
if (r == NULL)
{
sprintf (output, "w %s = No current room.",
p->name);
socket_write (g->socket, output);
}
}
else
{
if (isalpha (*l))
r = room_find (g->room_list, l);
else
r = room_find_num (g->room_list, atoi(l));
if (r == NULL)
{
sprintf (output, "w %s = Room %s not found.",
p->name, l);
socket_write (g->socket, output);
}
}
return r;
}
void command_exit_add (globals *g, player *p, char *l)
{
room *r, *dest;
link *list;
#ifdef FUNCTIONS
puts ("**command_exit_add");
#endif
l = tokenize (word, l);
r = command_exit_roomfind (g, p, word);
l = tokenize (word, l);
dest = command_exit_roomfind (g, p, word);
if ((r != NULL) && (dest != NULL))
{
l = tokenize (word, l);
if (strlen (word))
{
link_add (r->links, dest, word);
if (p->verbose)
{
sprintf (output, "w %s = Exit %s added \
to room %s from room %s.",
p->name, word, dest->name,
r->name);
socket_write (g->socket, output);
}
}
else
{
if (p->verbose)
{
sprintf (output, "w %s = You have to \
specify a name for the exit",
p->name);
socket_write (g->socket, output);
}
}
}
}
void command_exit_delete (globals *g, player *p, char *l)
{
room *r;
link *list;
#ifdef FUNCTIONS
puts ("**command_exit_delete");
#endif
l = tokenize (word, l);
r = command_exit_roomfind (g, p, word);
if (r != NULL)
{
l = tokenize (word, l);
if (strlen (word))
{
link *li;
if (isalpha (*word))
li = link_find (r->links, word);
else
li = link_find_num (r->links, atoi(word));
if (li != NULL)
{
link_delete (r->links, li);
if (p->verbose)
{
sprintf (output, "w %s = Exit %s \
deleted from room %s.",
p->name, word, r->name);
socket_write (g->socket, output);
}
}
else
{
if (p->verbose)
{
sprintf (output, "w %s = Exit %s \
not found in room %s.",
p->name, word, r->name);
socket_write (g->socket, output);
}
}
}
else
{
if (p->verbose)
{
sprintf (output, "w %s = You have to \
specify a name for the exit",
p->name);
socket_write (g->socket, output);
}
}
}
}
void command_exit_list (globals *g, player *p, char *l)
{
room *r;
link *list;
#ifdef FUNCTIONS
puts ("**command_exit_list");
#endif
l = tokenize (word, l);
r = command_exit_roomfind (g, p, word);
if (r != NULL)
{
if (r->links->head != NULL)
{
link *li;
int num = 1;
sprintf (output, "w %s = Exits for room %s:",
p->name, r->name);
socket_write (g->socket, output);
for (li = r->links->head;
li != NULL;
li = li->next, num++)
{
sprintf (output, "w %s = %d %s -> %d %s",
p->name, num, li->name,
room_num (g->room_list, li->dest),
(li->dest != NULL)? li->dest->name :
"Nowhere");
socket_write (g->socket, output);
}
}
else
{
if (p->verbose)
{
sprintf (output, "w %s = No exits in \
room %s.", p->name, r->name);
socket_write (g->socket, output);
}
}
}
}
void command_exit (globals *g, player *p, char *l)
{
#ifdef FUNCTIONS
puts ("**command_exit");
#endif
l = tokenize (word, l);
if (strlen (word) == 0)
{
if (p->verbose)
{
sprintf (output,
"w %s = exit commands:add, delete, list",
p->name);
socket_write (g->socket, output);
}
return;
}
if (!strcasecmp (word, "add")) command_exit_add (g, p, l);
if (!strcasecmp (word, "delete")) command_exit_delete (g, p, l);
if (!strcasecmp (word, "list")) command_exit_list (g, p, l);
}