dbm/
misc/
old-docs/
/* cmds.c */

#include "copyright.h"
#include "config.h"

#include <stdio.h>
#ifdef STRING_H
#include <string.h>
#else
#include <strings.h>
#endif				/* STRING_H */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <ctype.h>

#include "teeny.h"
#include "match.h"
#include "case.h"

extern char     cmdwork[];

voidfunc        do_enter(player, arg)
  int             player;
  char           *arg;
{
  int             here, obj;
  char           *name;

  if (!arg || !*arg) {
    notify_player(player, "Enter what?\r\n");
    return;
  }
  if (get_int_elt(player, LOC, &here) == -1)
    goto enterbomb;

  if ((obj = match_here(player, here, arg, MAT_THINGS)) == -1) {
    if ((obj = match_here(player, here, arg, MAT_PLAYERS)) == -1) {
      notify_player(player, "I don't see that here.\r\n");
      return;
    }
  }
  if (obj == -2) {
    notify_player(player, "I can't tell which one you mean.\r\n");
    return;
  }
  if ((!controls(player, obj) && !isenterok(obj)) ||
      islocked(player, obj, ELOCK)) {
    act_object(player, obj, EFAIL, OEFAIL, -1, "You don't quite fit.",
	       (char *) 0);
    return;
  }
  name = getname(player);
  act_object(player, obj, ENTER, OENTER, -1, (char *) 0, (char *) 0);
  act_object(player, obj, -1, OXENTER, obj, (char *) 0, (char *) 0);
  if (!isdark(player) && !isdark(here)) {
    sprintf(cmdwork, "%s has left.\r\n", name);
    notify_oall(player, cmdwork);
  }
  list_drop(player, here, CONTENTS_LIST);
  list_add(player, obj, CONTENTS_LIST);
  if (set_int_elt(player, LOC, obj) == -1)
    goto enterbomb;

  if (!isdark(player) && !isdark(obj)) {
    sprintf(cmdwork, "%s has arrived.\r\n", name);
    notify_oall(player, cmdwork);
  }
  stamp(here);

  do_look(player, (char *) 0);

  return;

enterbomb:

  notify_bad(player);
  return;
}

voidfunc        do_leave(player)
  int             player;
{
  int             here, hereloc;
  char           *name;

  if (get_int_elt(player, LOC, &here) == -1)
    goto leavebomb;

  if (isroom(here)) {
    notify_player(player, "You're not inside of anything to leave!\r\n");
    return;
  }
  if (get_int_elt(here, LOC, &hereloc) == -1)
    goto leavebomb;
  name = getname(player);
  act_object(player, here, LEAVE, OLEAVE, -1, (char *) 0, (char *) 0);
  act_object(player, here, -1, OXLEAVE, hereloc, (char *) 0, (char *) 0);

  if (!isdark(player) && !isdark(here)) {
    sprintf(cmdwork, "%s has left.\r\n", name);
    notify_oall(player, cmdwork);
  }
  list_drop(player, here, CONTENTS_LIST);
  list_add(player, hereloc, CONTENTS_LIST);
  if (set_int_elt(player, LOC, hereloc) == -1)
    goto leavebomb;

  if (!isdark(player) && !isdark(hereloc)) {
    sprintf(cmdwork, "%s has arrived.\r\n", name);
    notify_oall(player, cmdwork);
  }
  stamp(here);

  do_look(player, (char *) 0);

  return;

leavebomb:

  notify_bad(player);
  return;
}

voidfunc        do_fixrooms(player)
  int             player;
{
  register int    i;

  if (player != PLAYER_GOD) {
    notify_player(player, "Buzz off.\r\n");
    return;
  }
  for (i = 0; i < db_top(); i++) {
    if (!exists_object(i) || !isroom(i))
      continue;
    if (set_int_elt(i, NEXT, -1) == -1)
      continue;
  }
  for (i = 0; i < db_top(); i++) {
    if (!exists_object(i) || !isroom(i))
      continue;
    if (set_int_elt(i, LOC, ROOT_PARENT) == -1)
      continue;
    if (i != ROOT_PARENT)
      list_add(i, ROOT_PARENT, ROOMS_LIST);
  }
  notify_player(player, "Done.\r\n");
}

voidfunc        do_attach(player, argone, argtwo)
  int             player;
  char           *argone;
  char           *argtwo;
{
  int             dest, action, loc;

  if (!argone || !*argone || !argtwo || !*argtwo) {
    notify_player(player, "Attach what to what?\r\n");
    return;
  }
  if ((action = resolve_exit(player, argone)) == -1) {
    notify_player(player, "I can't find that action.\r\n");
    return;
  }
  if (action == -2) {
    notify_player(player, "I can't tell which action you mean.\r\n");
    return;
  }
  if ((dest = resolve_object(player, argtwo)) == -1) {
    if ((dest = resolve_player(player, argone, iswiz(player))) == -1) {
      notify_player(player, "I can't find that source.\r\n");
      return;
    }
  }
  if (dest == -2) {
    notify_player(player, "I can't tell which source you mean.\r\n");
    return;
  }
  if (!controls(player, action)) {
    notify_player(player, "Permission denied.\r\n");
    return;
  }
  if (!controls(player, dest) || isexit(dest)) {
    notify_player(player, "You can't attach anything to that!\r\n");
    return;
  }
  if (get_int_elt(action, LOC, &loc) == -1)
    goto bomb;
  list_drop(action, loc, EXITS_LIST);
  list_add(action, dest, EXITS_LIST);
  if (set_int_elt(action, LOC, dest) == -1)
    goto bomb;

  stamp(action);

  notify_player(player, "Action reattached.\r\n");
  return;

bomb:
  notify_bad(player);
}

/*
 * Basic player commands pertaining to communication.
 */

voidfunc        do_pose(player, arg)
  int             player;
  char           *arg;
{
  char           *name;

  if (get_str_elt(player, NAME, &name) == -1)
    goto posebomb;

  while (arg && *arg && isspace(*arg))
    arg++;

  if (arg && *arg)
    sprintf(cmdwork, "%s%s%s\r\n", name, (arg[0] == '\'' || arg[0] == ',') ?
	    "" : " ", (arg && *arg) ? arg : "");
  else
    sprintf(cmdwork, "%s\r\n", name);
  notify_all(player, cmdwork);
  return;
posebomb:
  notify_bad(player);
  return;
}

voidfunc        do_page(player, argone, argtwo)
  int             player;
  char           *argone, *argtwo;
{
  int             pagee;
  char           *name;
  int             location;

  if (argone == NULL) {
    notify_player(player, "Page whom?\r\n");
    return;
  }
  if (issticky(player)) {
    notify_player(player, "You can't send pages while ignoring them.\r\n");
    return;
  }
  if ((pagee = match_active_player(argone)) == -1 || pagee == -2) {
    if ((pagee = match_who(argone)) == -1) {
      if ((pagee = match_player(argone)) == -1) {
	notify_player(player, "No such player.\r\n");
	return;
      }
    }
  }
  if (!isalive(pagee)) {
    notify_player(player, "That player is not connected.\r\n");
    return;
  }
  if (issticky(pagee)) {
    notify_player(player,
		  "That player can't be disturbed at the moment.\r\n");
    return;
  }
  /* OK. Send the message. */

  if (argtwo == NULL) {
    if (get_str_elt(player, NAME, &name) == -1)
      goto pagebomb;
    if (get_int_elt(player, LOC, &location) == -1)
      goto pagebomb;
    sprintf(cmdwork, "You sense that %s is looking for you in %s", name,
	    getname(location));
    if (controls(pagee, location) || isjumpok(location))
      sprintf(cmdwork + strlen(cmdwork), "(#%d)\r\n", location);
    else
      strcat(cmdwork, "\r\n");

    notify_player(pagee, cmdwork);
  } else {			/* message page */
    if (get_str_elt(player, NAME, &name) == -1)
      goto pagebomb;
    if (argtwo && *argtwo && *argtwo == ':' && argtwo[1]) {
      argtwo++;
      sprintf(cmdwork, "From afar, %s%s%s\r\n", name, (argtwo[0] != '\'' &&
				      argtwo[0] != ',') ? " " : "", argtwo);
    } else
      sprintf(cmdwork, "%s pages: %s\r\n", name, (argtwo && *argtwo) ? argtwo
	      : "");
    notify_player(pagee, cmdwork);
  }
  notify_player(player, "Your message has been sent.\r\n");
  return;
pagebomb:
  notify_bad(player);
  return;
}
voidfunc        do_say(player, arg)
  int             player;
  char           *arg;
{
  char           *name;

  if (get_str_elt(player, NAME, &name) == -1)
    goto saybomb;

  while (arg && *arg && isspace(*arg))
    arg++;

  sprintf(cmdwork, "%s says, \"%s\"\r\n", name, (arg && *arg) ? arg : "");
  notify_oall(player, cmdwork);

  sprintf(cmdwork, "You say, \"%s\"\r\n", (arg && *arg) ? arg : "");
  notify_player(player, cmdwork);
  return;
saybomb:
  notify_bad(player);
  return;
}
voidfunc        do_whisper(player, argone, argtwo)
  int             player;
  char           *argone, *argtwo;
{
  int             whisperee, here;
  char           *name;

  if (get_int_elt(player, LOC, &here) == -1)
    goto whisperbomb;

  if (argone == NULL || (!iswiz(player) &&
       (whisperee = match_here(player, here, argone, MAT_PLAYERS)) == -1)) {
    notify_player(player, "Whisper to whom?\r\n");
    return;
  }
  if (iswiz(player)) {		/* wizard whisper */
    if (argone == NULL ||
	(whisperee = resolve_player(player, argone, 1)) == -1) {
      notify_player(player, "Whisper to whom?\r\n");
      return;
    }
  }
  if (whisperee == -2) {
    notify_player(player, "I don't know which player you mean.\r\n");
    return;
  }
  /* OK. Tell the players */

  while (argtwo && *argtwo && isspace(*argtwo))
    argtwo++;

  if (argtwo && *argtwo && argtwo[0] == ':' && argtwo[1]) {
    argtwo++;

    if (get_str_elt(player, NAME, &name) == -1)
      goto whisperbomb;
    notify_player(player, "Your message has been sent.\r\n");
    sprintf(cmdwork, "You sense that %s%s%s\r\n", name,
	    (argtwo[0] == '\'' || argtwo[0] == ',') ? "" : " ",
	    argtwo);
    notify_player(whisperee, cmdwork);
  } else {
    if (get_str_elt(whisperee, NAME, &name) == -1)
      goto whisperbomb;

    sprintf(cmdwork, "You whisper, \"%s\" to %s.\r\n", (argtwo && *argtwo)
	    ? argtwo : "", name);
    notify_player(player, cmdwork);

    if (get_str_elt(player, NAME, &name) == -1)
      goto whisperbomb;

    sprintf(cmdwork, "%s whispers, \"%s\"\r\n", name, (argtwo && *argtwo) ?
	    argtwo : "");
    notify_player(whisperee, cmdwork);
  }
  return;
whisperbomb:
  notify_bad(player);
  return;
}