#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);
}