dmuck0.15-beta/docs/muf/
dmuck0.15-beta/game/
dmuck0.15-beta/game/logs/
dmuck0.15-beta/game/muf/
dmuck0.15-beta/game/muf/text/
#include "prims.h"
/* private globals */
extern inst *p_oper1, *p_oper2, *p_oper3, *p_oper4;
extern int p_result, p_nargs;
extern char p_buf[BUFFER_LEN];
extern dbref p_ref;

void prims_getpropval (__P_PROTO)
{
  char *tmp;
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!p_oper1->data.string) abort_interp("Empty string argument (2)");
  if (!valid_object(p_oper2)) abort_interp("Non-object argument (1)");

  tmp = get_property_data(p_oper2->data.objref, p_oper1->data.string,
    access_rights(player, p_oper2->data.objref, program));

  CLEAR(p_oper1);
  CLEAR(p_oper2);
  if (tmp) p_result = atoi(tmp);
  else p_result = 0;
  push(arg, top, PROG_INTEGER, MIPSCAST &p_result);
}

void prims_getpropstr (__P_PROTO)
{
  char *temp;

  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!p_oper1->data.string) abort_interp("Empty string argument (2)");
  if (!valid_object(p_oper2)) abort_interp("Non-object argument (1)");

  temp = get_property_data(p_oper2->data.objref, p_oper1->data.string,
    access_rights(player, p_oper2->data.objref, program));
  temp = get_uncompress(temp);

  CLEAR(p_oper1);
  CLEAR(p_oper2);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(temp));
}

void prims_remove_prop (__P_PROTO)
{
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!p_oper1->data.string) abort_interp("Empty string argument (2)");
  if (!valid_object(p_oper2)) abort_interp("Non-object argument (1)");

  remove_property(p_oper2->data.objref, p_oper1->data.string,
    access_rights(player, p_oper2->data.objref, program));

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_addprop (__P_PROTO)
{
  char *temp;

  CHECKOP(4);
  p_oper1 = POP();
  p_oper2 = POP();
  p_oper3 = POP();
  p_oper4 = POP();

  if (p_oper1->type != PROG_INTEGER) abort_interp("Non-integer argument (4)");
  if (p_oper2->type != PROG_STRING) abort_interp("Non-string argument (3)");
  if (p_oper3->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!p_oper3->data.string) abort_interp("Empty string argument (2)");
  if (!valid_object(p_oper4)) abort_interp("Non-object argument (1)");

  sprintf(p_buf, "%d", p_oper1->data.number);
  temp = get_compress(p_oper2->data.string ? p_oper2->data.string : p_buf);
  if(!add_property(p_oper4->data.objref, p_oper3->data.string, temp,
    default_perms(p_oper3->data.string),
    access_rights(player, p_oper4->data.objref, program)))
    abort_interp("Permission denied.");

  CLEAR(p_oper1);
  CLEAR(p_oper2);
  CLEAR(p_oper3);
  CLEAR(p_oper4);
}

void prims_name (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();
  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(NAME(p_ref)) strcpy(p_buf, unparse_name(p_ref));
  else p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

/* fullname ( d -- s )...returns all in compound name... */
void prims_fullname (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();
  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(NAME(p_ref)) strcpy(p_buf, NAME(p_ref));
  else p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}
void prims_desc (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();

  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(GET_DESC(p_ref))
    strcpy(p_buf, get_uncompress(GET_DESC(p_ref)));
  else p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

void prims_succ (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();

  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(GET_SUCC(p_ref))
    strcpy(p_buf, get_uncompress(GET_SUCC(p_ref)));
  else p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

void prims_fail (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();

  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(GET_FAIL(p_ref))
    strcpy(p_buf, get_uncompress(GET_FAIL(p_ref)));
  else p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

void prims_drop (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();

  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(GET_DROP(p_ref))
    strcpy(p_buf, get_uncompress(GET_DROP(p_ref)));
  else p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

void prims_osucc (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();

  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(GET_OSUCC(p_ref))
    strcpy(p_buf, get_uncompress(GET_OSUCC(p_ref)));
  else
    p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

void prims_ofail (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();

  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(GET_OFAIL(p_ref))
    strcpy(p_buf, get_uncompress(GET_OFAIL(p_ref)));
  else p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

void prims_odrop (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();

  if (!valid_object(p_oper1)) abort_interp("Invalid argument type.");

  p_ref = p_oper1->data.objref;
  if(GET_ODROP(p_ref))
    strcpy(p_buf, get_uncompress(GET_ODROP(p_ref)));
  else p_buf[0] = '\0';

  CLEAR(p_oper1);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

void prims_setname (__P_PROTO)
{
  char *b;
  CHECKOP(2);                    /*  Modified to allow player name changes */
  p_oper1 = POP();              
  p_oper2 = POP();

  if (!valid_object(p_oper2)) abort_interp("Invalid argument type (1)");
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!fr->wizard && !permissions(fr->euid, p_ref))
    abort_interp("Permission denied.");

  b = DoNullInd(p_oper1->data.string);
  p_ref = p_oper2->data.objref;

  if (Typeof(p_ref) == TYPE_PLAYER) {
if(o_player_names) {
  if (!controls(fr->euid, p_ref)) abort_interp("Permission denied.");
  if (!ok_player_name(b, p_ref)) abort_interp("Invalid name.");
 if(o_taboonames) {
   if (!ok_taboo_name(p_ref, b, 1)) abort_interp("Disallowed name.");
  }
      log_status("NAME CHANGE: %s(#%d) to %s\n", NAME(p_ref), p_ref, b);
      sprintf(p_buf, "%s did a name change:", unparse_name(player));
      strcat(p_buf, unparse_name(p_ref));
      strcat(p_buf, "->");
      delete_player(p_ref);
      if (NAME(p_ref)) free(NAME(p_ref));
      NAME(p_ref) = dup_string(b);
      add_player(p_ref);
      strcat(p_buf, unparse_name(p_ref));
   if(o_notify_wiz) {
      notify_wizards(p_buf);
     }
      DBSTORE(p_ref, time_modified, time(NULL));
 } else {
    abort_interp("Permission denied.");
  }
   }else {
    if (!ok_name(b)) abort_interp("Invalid name.");
        if (NAME(p_ref)) free(NAME(p_ref));
        DBSTORE(p_ref, name, dup_string(b));
         }

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_setdesc (__P_PROTO)
{
  char *b;
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  b = DoNullInd(p_oper1->data.string);
  if (!valid_object(p_oper2)) abort_interp("Invalid argument type (1)");
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");

  p_ref = p_oper2->data.objref;
  if (!fr->wizard && !permissions(fr->euid, p_ref))
    abort_interp("Permission denied.");
  if (GET_DESC(p_ref)) 
#ifndef USE_DBP_STR
    free((void *) DBFETCH(p_ref)->desc);
    DBSTORE(p_ref, desc, alloc_compressed(b));
#else
     remove_property(p_ref, "desc", ACCESS_WI);
     add_property(p_ref, "desc", b, PERMS_COREAD | PERMS_COWRITE | 
                  PERMS_COSRCH | PERMS_OTREAD | PERMS_OTSRCH, ACCESS_WI);
#endif

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_setsucc (__P_PROTO)
{
  char *b;
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  b = DoNullInd(p_oper1->data.string);
  if (!valid_object(p_oper2)) abort_interp("Invalid argument type (1)");
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");

  p_ref = p_oper2->data.objref;
  if (!fr->wizard && !permissions(fr->euid, p_ref))
    abort_interp("Permission denied.");
  if (GET_SUCC(p_ref)) 
#ifndef USE_DBP_STR
      free((void *) DBFETCH(p_ref)->succ);
      DBSTORE(p_ref, succ, alloc_compressed(b));
#else
      remove_property(p_ref, "succ", ACCESS_CO);
      add_property(p_ref, "succ", b, PERMS_COREAD | PERMS_COWRITE | 
                   PERMS_COSRCH | PERMS_OTREAD | PERMS_OTSRCH, ACCESS_WI);
#endif

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_setfail (__P_PROTO)
{
  char *b;
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  b = DoNullInd(p_oper1->data.string);
  if (!valid_object(p_oper2)) abort_interp("Invalid argument type (1)");
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  p_ref = p_oper2->data.objref;
  if (!fr->wizard && !permissions(fr->euid, p_ref))
    abort_interp("Permission denied.");

  if (GET_FAIL(p_ref))
#ifndef USE_DBP_STR
    free((void *) DBFETCH(p_ref)->fail);
    DBSTORE(p_ref, fail, alloc_compressed(b));
#else
      remove_property(p_ref, "fail", ACCESS_CO);
      add_property(p_ref, "fail", b, PERMS_COREAD | PERMS_COWRITE | 
                   PERMS_COSRCH | PERMS_OTREAD | PERMS_OTSRCH, ACCESS_WI);
#endif

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_setdrop (__P_PROTO)
{
  char *b;
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  b = DoNullInd(p_oper1->data.string);
  if (!valid_object(p_oper2)) abort_interp("Invalid argument type (1)");
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");

  p_ref = p_oper2->data.objref;
  if (!fr->wizard && !permissions(fr->euid, p_ref))
    abort_interp("Permission denied.");
  if (GET_DROP(p_ref)) 
#ifndef USE_DBP_STR
      free((void *) DBFETCH(p_ref)->drop);
      DBSTORE(p_ref, drop, alloc_compressed(b));
#else
      remove_property(p_ref, "drop", ACCESS_CO);
      add_property(p_ref, "drop", b, PERMS_COREAD | PERMS_COWRITE | 
                   PERMS_COSRCH | PERMS_OTREAD | PERMS_OTSRCH, ACCESS_WI);
#endif

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_setosucc (__P_PROTO)
{
  char *b;
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  b = DoNullInd(p_oper1->data.string);
  if (!valid_object(p_oper2)) abort_interp("Invalid argument type (1)");
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  p_ref = p_oper2->data.objref;
  if (!fr->wizard && !permissions(fr->euid, p_ref))
    abort_interp("Permission denied.");
  if (GET_OSUCC(p_ref)) 
#ifndef USE_DBP_STR
      free((void *) DBFETCH(p_ref)->osucc);
      DBSTORE(p_ref, osucc, alloc_compressed(b));
#else
      remove_property(p_ref, "osucc", ACCESS_CO);
      add_property(p_ref, "osucc", b, PERMS_COREAD | PERMS_COWRITE | 
                   PERMS_COSRCH | PERMS_OTREAD | PERMS_OTSRCH, ACCESS_WI);
#endif

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_setofail (__P_PROTO)
{
  char *b;
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  b = DoNullInd(p_oper1->data.string);
  if (!valid_object(p_oper2)) abort_interp("Invalid argument type (1)");
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  p_ref = p_oper2->data.objref;
  if (!fr->wizard && !permissions(fr->euid, p_ref))
    abort_interp("Permission denied.");
  if (GET_OFAIL(p_ref)) 
#ifndef USE_DBP_STR
      free((void *) DBFETCH(p_ref)->ofail);
      DBSTORE(p_ref, ofail, alloc_compressed(b));
#else
      remove_property(p_ref, "ofail", ACCESS_CO);
      add_property(p_ref, "ofail", b, PERMS_COREAD | PERMS_COWRITE | 
                   PERMS_COSRCH | PERMS_OTREAD | PERMS_OTSRCH, ACCESS_WI);
#endif

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_setodrop (__P_PROTO)
{
  char *b;
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  b = DoNullInd(p_oper1->data.string);
  if (!valid_object(p_oper2)) abort_interp("Invalid argument type (1)");
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");

  p_ref = p_oper2->data.objref;
  if (!fr->wizard && !permissions(fr->euid, p_ref))
    abort_interp("Permission denied.");
  if (GET_ODROP(p_ref)) 
#ifndef USE_DBP_STR
      free((void *) DBFETCH(p_ref)->odrop);
      DBSTORE(p_ref, odrop, alloc_compressed(b));
#else
      remove_property(p_ref, "odrop", ACCESS_CO);
      add_property(p_ref, "odrop", b, PERMS_COREAD | PERMS_COWRITE | 
                   PERMS_COSRCH | PERMS_OTREAD | PERMS_OTSRCH, ACCESS_WI);
#endif

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

void prims_pennies (__P_PROTO)
{
  CHECKOP(1);
  p_oper1 = POP();

  if (!valid_object(p_oper1)) abort_interp("Invalid argument.");

  switch(Typeof(p_oper1->data.objref))
  {
    case TYPE_PLAYER:
      p_result = DBFETCH(p_oper1->data.objref)->pennies;
      break;
    case TYPE_THING:
      p_result = DBFETCH(p_oper1->data.objref)->pennies;
      break;
    default:
      abort_interp("Invalid argument.");
   }

   CLEAR(p_oper1);
   push(arg, top, PROG_INTEGER, MIPSCAST &p_result);
}

void prims_addpennies (__P_PROTO)
{
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  if (!valid_object(p_oper2)) abort_interp("Invalid object.");
  if (p_oper1->type != PROG_INTEGER) abort_interp("Non-integer argument (2)");

  p_ref = p_oper2->data.objref;
  if (Typeof(p_ref) == TYPE_PLAYER)
  {
    p_result = p_oper1->data.number;
    if (!fr->wizard)
    {
      if (p_result + DBFETCH(p_ref)->pennies > MAX_PENNIES)
	abort_interp("Would exceed MAX_PENNIES.");
      if (p_result < 0) abort_interp("Amount would be negative.");
      if (!payfor(DBFETCH(fr->prog)->owner, p_oper1->data.number))
        abort_interp("Out of money.");
    }
    DBSTORE(p_ref, pennies, DBFETCH(p_ref)->pennies + p_result);
  }
  else if (Typeof(p_ref) == TYPE_THING)
  {
    if (!fr->wizard) abort_interp("Permission denied.");
    p_result = DBFETCH(p_ref)->pennies + p_oper1->data.number;
    if (p_result < 1) abort_interp("Result must be positive.");
    DBFETCH(p_ref)->pennies += p_oper1->data.number;
    DBDIRTY(p_ref);
  }
  else abort_interp("Invalid object type.");

  CLEAR(p_oper1);
  CLEAR(p_oper2);
}

/*
  SETPROP ( d s s -- )
  d - object
  s - property
  s - value to be set to
*/
void prims_setprop (__P_PROTO)
{
  char *temp;

  CHECKOP(3);
  p_oper1 = POP();
  p_oper2 = POP();
  p_oper3 = POP();

  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (3)");
  if (p_oper2->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!p_oper2->data.string) abort_interp("Empty string argument (2)");
  if (!valid_object(p_oper3)) abort_interp("Non-object argument (1)");
   
  temp = get_compress(p_oper1->data.string ? p_oper1->data.string : "");
  add_property(p_oper3->data.objref, p_oper2->data.string, temp,
    default_perms(p_oper2->data.string),
    access_rights(player, p_oper3->data.objref, program));

  CLEAR(p_oper1);
  CLEAR(p_oper2);
  CLEAR(p_oper3);
}

/*
  SETPERMS ( d s i -- )
  d - object
  s - property
  i - permissions
*/
void prims_setperms (__P_PROTO)
{
  CHECKOP(3);
  p_oper1 = POP();
  p_oper2 = POP();
  p_oper3 = POP();

  if (p_oper1->type != PROG_INTEGER) abort_interp("Non-number argument (3)");
  if (p_oper2->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!p_oper2->data.string) abort_interp("Empty string argument (2)");
  if (!valid_object(p_oper3)) abort_interp("Non-object argument (1)");
   
  change_perms(p_oper3->data.objref, p_oper2->data.string, p_oper1->data.number,
    access_rights(player, p_oper3->data.objref, program));

  CLEAR(p_oper1);
  CLEAR(p_oper2);
  CLEAR(p_oper3);
}

/*
  PERMS ( d s -- i )
  d - object
  s - property
  i - permissions
*/
void prims_perms (__P_PROTO)
{
  propdir *p;

  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!p_oper1->data.string) abort_interp("Empty string argument (2)");
  if (!valid_object(p_oper2)) abort_interp("Non-object argument (1)");
   
  p = find_property(p_oper2->data.objref, p_oper1->data.string,
    access_rights(player, p_oper3->data.objref, program));
  p_result = (p) ? p->perms : 0;

  CLEAR(p_oper1);
  CLEAR(p_oper2);
  push(arg, top, PROG_INTEGER, MIPSCAST &p_result);
}

/*
  nextprop? ( d s -- i )
  d - object
  s - property
  i - if property ends in /, does property have children?  if not, is there
      one next in line?
*/
void prims_nextpropp (__P_PROTO)
{
  int i;

  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();

  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!valid_object(p_oper2)) abort_interp("Non-object argument (1)");
   
  i = strlen(p_oper1->data.string);

  p_result = has_next_property(p_oper2->data.objref, p_oper1->data.string,
    access_rights(player, p_oper3->data.objref, program),
    i ? p_oper1->data.string[i - 1] == '/' : 0);

  CLEAR(p_oper1);
  CLEAR(p_oper2);
  push(arg, top, PROG_INTEGER, MIPSCAST &p_result);
}

void prims_nextprop (__P_PROTO)
{
  CHECKOP(2);
  p_oper1 = POP();
  p_oper2 = POP();
  if (p_oper1->type != PROG_STRING) abort_interp("Non-string argument (2)");
  if (!valid_object(p_oper2)) abort_interp("Non-object argument (1)");

  next_property(p_buf, p_oper2->data.objref, p_oper1->data.string,
    access_rights(player, p_oper2->data.objref, program));

  CLEAR(p_oper1);
  CLEAR(p_oper2);
  push(arg, top, PROG_STRING, MIPSCAST dup_string(p_buf));
}

void prims_is_propdir(__P_PROTO)
{
    CHECKOP(2);
    p_oper2 = POP();		/* prop name */
    p_oper1 = POP();		/* dbref */

    if (p_oper1->type != PROG_OBJECT) abort_interp("Non dbref argument (1)");
    if (!valid_object(p_oper1)) abort_interp("Invalid dbref (1)");
    if (p_oper2->type != PROG_STRING) abort_interp("Non string argument (2)");
    if (!p_oper2->data.string) abort_interp("Null string not allowed. (2)");

    p_ref = p_oper1->data.objref;
    strcpy(p_buf, p_oper2->data.string);

    CLEAR(p_oper1);
    CLEAR(p_oper2);

    p_result = is_propdir(player, p_ref, p_buf, program);
    push(arg, top, PROG_INTEGER, MIPSCAST &p_result);
}