DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T o

⟦0462e42d5⟧ TextFile

    Length: 12950 (0x3296)
    Types: TextFile
    Names: »objsys.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Abermud/objsys.c« 

TextFile

#include "kernel.h"
#ifdef	RCSID
static char RCS[] =
	"$Header: objsys.c,v 1.1 89/03/13 09:37:18 rsalz Exp $";
#endif	/* RCSID */


static LEVEL u;

static char *classnam[] =
{
    "light", "unlight", "open", "shut", "closed", "locked", "unlocked",
    "weapon", "container", "food", "all", NULL
};

static short class_data[] = {
    1 << 13, 0,
    -999, 0,
    1 << 2, 0,
    -999, 2,
    -999, 2,
    1 << 3, 2,
    -999, 5,
    1 << 15, -1,
    1 << 14, -1,
    1 << 6, -1,
    0, -1
};


inventory()
{
    bprintf("You are carrying\n");
    lobjsat(mynum);
}

lobjsat(loc)
{
    aobjsat(loc, 1, 0);
}

mlobjsat(x, m)
{
    aobjsat(x, 1, m);
}


aobjsat(loc, mode, marg)		/* Carried Loc ! */
    int loc, mode;
{
    int ostack[16];
    int ostackp;
    int a, c, e, f, g;
    char x[6], y[6];


    ostackp = 0;
    for (f = 0; f < marg; f++)
	bprintf(" ");

    for (e = 0, c = 0; c < numobs; c++) {
	g = 0;
	if ((iscarrby(c, loc) && mode == 1)
	 || (iscontin(c, loc) && mode == 3)) {
	    e = 1;
	    g = 1;
	    f += 1 + strlen(oname(c));
	    if (debug_mode) {
		f += 5;
		sprintf(x, "%d", c);
		sprintf(y, "{%-3s}", x);
	    }
	    if (otstbit(c, 0))
		f += 2;
	    if (iswornby(c, loc))
		f += strlen("<worn> ");
	    if (f > 79) {
		bprintf("\n");
		for (f = 0; f < marg; f++)
		    bprintf(" ");
	    }
	    if (otstbit(c, 0))
		bprintf("(");
	    bprintf("%s", oname(c));
	    if (debug_mode)
		bprintf(y);
	    if (iswornby(c, loc))
		bprintf(" <worn>");
	    if (otstbit(c, 0))
		bprintf(")");
	    bprintf(" ");
	    if (otstbit(c, 14) && g && (!otstbit(c, 2) || state(c) == 0)) {
		ostack[ostackp++] = c;
		f++;
	    }
	}
    }
    if (!e)
	bprintf("Nothing");
    bprintf("\n");
    for (f = 0; f < ostackp; f++) {
	for (a = 0; a < marg; a++)
	    bprintf(" ");
	bprintf("    The %s contains\n", oname(ostack[f]));
	pbfr();
	aobjsat(ostack[f], 3, marg + 8);
    }
}


iscontin(o1, o2)
    int o1, o2;
{
    if (ocarrf(o1) != 3 || oloc(o1) != o2)
	return 0;
    if (plev(mynum) < 10 && otstbit(o1, 0))
	return 0;
    return 1;
}

brkwordw(x)
    char *x;
{
    strcpy(x, brkword() == -1 ? "<nothing>" : wordbuf);
}

fobnsys(nam, ctrl, ct_inf)
    char *nam;
    int ctrl, ct_inf;
{
    int a;
    int v = 0;
    char l1[128], l2[128];

    lowercase(strcpy(l1, nam));
    skicand = 0;
    if (EQ(l1, "first")) {
	v = 1;
	brkwordw(l1);
    }
    if (EQ(l1, "second")) {
	v = 2;
	brkwordw(l1);
    }
    if (EQ(l1, "third")) {
	v = 3;
	brkwordw(l1);
    }
    if (EQ(l1, "fourth")) {
	v = 4;
	brkwordw(l1);
    }
    if (EQ(l1, "fifth")) {
	v = 5;
	brkwordw(l1);
    }
    if (EQ(l1, "sixth")) {
	v = 6;
	brkwordw(l1);
    }
    if (EQ(l1, "green"))
	skicand = 1;
    if (EQ(l1, "red"))
	skicand = 1;
    if (EQ(l1, "blue"))
	skicand = 1;
    for (a = 0; a < numobs; a++) {
	strcpy(l2, oname(a));
	if (EQ(l1, lowercase(l2)) || EQ(l1, oaltname(a)) && --v < 1) {
	    strcpy(wd_it, nam);
	    switch (ctrl) {
	    case 0:
		return a;
	    case 1:		/* Patch for shields */
		if (a == 112 && iscarrby(113, mynum))
		    return 113;
		if (a == 112 && iscarrby(114, mynum))
		    return 114;
		if (isavl(a))
		    return a;
		break;
	    case 2:
		if (iscarrby(a, mynum))
		    return a;
		break;
	    case 3:
		if (iscarrby(a, ct_inf))
		    return a;
		break;
	    case 4:
		if (ishere(a))
		    return a;
		break;
	    case 5:
		if (iscontin(a, ct_inf))
		    return a;
		break;
	    default:
		return a;
	    }
	}
    }
    return -1;
}

fobn(word)
    char *word;
{
    int x;

    if ((x = fobna(word)) != -1)
	return x;
    return fobnsys(word, 0, 0);
}

fobna(word)
    char *word;
{
  return fobnsys(word, 1, 0);
}

fobnin(word, ct)
    char *word;
    int ct;
{
    return fobnsys(word, 5, ct);
}

fobnc(word)
    char *word;
{
    return fobnsys(word, 2, 0);
}

fobncb(word, by)
    char *word;
{
    return fobnsys(word, 3, by);
}

fobnh(word)
    char *word;
{
    return fobnsys(word, 4, 0);
}


getobj()
{
    int a;
    int i;
    int des_inf = -1;
    char bf[256];

    if (brkword() == -1) {
	bprintf("Get what ?\n");
	return -1;
    }
    if (findclass(wordbuf) != -1) {
	getall();
	return 0;
    }
    a = fobnh(wordbuf);
    /* Hold */
    i = stp;
    strcpy(bf, wordbuf);
    if (brkword() != -1 && (EQ(wordbuf, "from") || EQ(wordbuf, "out"))) {
	if (brkword() == -1) {
	    bprintf("From what ?\n");
	    return -1;
	}
	if ((des_inf = fobna(wordbuf)) == -1) {
	    bprintf("You can't take things from that - it's not here\n");
	    return -1;
	}
	a = fobnin(bf, des_inf);
    }
    stp = i;
    if (a == -1) {
	bprintf("That is not here.\n");
	return -1;
    }
    if (a == 112 && ishere(113))
	a = 113;
    if (a == 112 && ishere(114))
	a = 114;
    if (a == 112 && des_inf == -1) {
	if (otstbit(113, 0))
	    a = 113;
	else if (otstbit(114, 0))
	    a = 114;
	if (a == 113 || a == 114)
	    oclrbit(a, 0);
	else {
	    bprintf("The shields are all to firmly secured to the walls\n");
	    return 0;
	}
    }
    if (oflannel(a) == 1) {
	bprintf("You can't take that!\n");
	return -1;
    }
    if (des_inf == -1 || !iscarrby(des_inf, mynum))
	if (dragget())
	    return -1;
    if (!cancarry(mynum)) {
	bprintf("You can't carry any more\n");
	return -1;
    }
    if (a == 32 && state(a) == 1 && ptothlp(mynum) == -1) {
	bprintf("Its too well embedded to shift alone.\n");
	return 0;
    }
    setoloc(a, mynum, 1);
    sprintf(bf, "\001D%s\001\001c takes the %s\n\001", pname(mynum), oname(a));
    if (des_inf != -1)
	sprintf(bf, "\001D%s\001\001c takes the %s from the %s\n\001",
	    pname(mynum), oname(a), oname(des_inf));
    bprintf("Ok...\n");
    sendsys(pname(mynum), pname(mynum), -10000, ploc(mynum), bf);
    if (otstbit(a, 12))
	setobjstate(a, 0);
    if ((ploc(mynum) == -1081) && (state(20) == 0)) {
	setobjstate(20, 1);
	bprintf("The door clicks shut....\n");
    }
    return 0;
}

getall()
{
    int x;
    int cl;

    cl = findclass(wordbuf);
    if (isdark()) {
	bprintf("Its dark!\n");
	return;
    }
    if (brkword() != -1) {
	getallfr();
	return;
    }
    for (x = 0; x < numobs; x++) {
	if (ishere(x) && !oflannel(x) && classmatch(x, cl)) {
	    sprintf(strbuf, "%s", oname(x));
	    stp = 0;
	    bprintf("%s:\n", oname(x));
	    if (getobj() == -1)
		break;
	}
    }
}

getallfr()
{
    int a, x;
    int cl;

    cl = findclass(wordbuf);
    if (brkword() == -1) {
	bprintf("From what ?\n");
	return;
    }
    if ((a = fobna(wordbuf)) == -1) {
	bprintf("That isn't here.\n");
	return;
    }
    /* Do items */
    for (x = 0; x < numobs; x++) {
	if (iscontin(x, a) && !oflannel(x) && classmatch(x, cl)) {
	    sprintf(strbuf, "%s from %s", oname(x), oname(a));
	    stp = 0;
	    bprintf("%s:\n", oname(x));
	    if (getobj() == -1)
		break;
	}
    }
}

dropall()
{
    int x;
    int cl;

    for (cl = findclass(wordbuf), x = 0; x < numobs; x++) {
	if (iscarrby(x, mynum) && classmatch(x, cl)) {
	    sprintf(strbuf, "%s", oname(x));
	    stp = 0;
	    bprintf("%s:\n", oname(x));
	    if (dropitem() == -1)
		return;
	}
    }
}

ishere(item)
    int item;
{
    if (plev(mynum) < 10 && otstbit(item, 0))
	return 0;
    if (ocarrf(item) == 1 || oloc(item) != ploc(mynum))
	return 0;
    return 1;
}

iscarrby(item, user)
    int item, user;
{
    if (plev(mynum) < 10 && otstbit(item, 0))
	return 0;
    if (ocarrf(item) != 1 && ocarrf(item) != 2)
	return 0;
    if (oloc(item) != user)
	return 0;
    return 1;
}

dropitem()
{
    int a;
    char bf[80];

    if (brkword() == -1) {
	bprintf("Drop what ?\n");
	return -1;
    }
    if (findclass(wordbuf) != -1) {
	dropall();
	return 0;
    }
    if ((a = fobnc(wordbuf)) == -1) {
	bprintf("You are not carrying that.\n");
	return -1;
    }

    if (plev(mynum) < 10 && a == 32) {
	bprintf("You can't let go of it!\n");
	return 0;
    }
    setoloc(a, ploc(mynum), 0);
    bprintf("OK..\n");
    sprintf(bf, "\001D%s\001\001c drops the %s.\n\n\001",
	pname(mynum), oname(a));
    sendsys(pname(mynum), pname(mynum), -10000, ploc(mynum), bf);
    if (ploc(mynum) != -183 && ploc(mynum) != -5)
	return 0;
    sprintf(bf, "The %s disappears into the bottomless pit.\n", oname(a));
    bprintf("It disappears down into the bottomless pit.....\n");
    sendsys(pname(mynum), pname(mynum), -10000, ploc(mynum), bf);
    setpscore(mynum, pscore(mynum) + (tscale() * obaseval(a)) / 9);
    calibme();
    setoloc(a, -6, 0);
    return 0;
}

lisobs()
{
    lojal2(1);
    showwthr();
    lojal2(0);
}

lojal2(n)
    int n;
{
    int a;

    for (a = 0; a < numobs; a++) {
	if (ishere(a) && oflannel(a) == n) {
	    if (state(a) > 3)
		continue;
	    if (!EMPTY(olongt(a, state(a)))) {	/* OLONGT NOTE TO BE ADDED */
		if (otstbit(a, 0))
		    bprintf("--");
		oplong(a);
		strcpy(wd_it, oname(a));
	    }
	    else if (my_lev > 9999)
		bprintf("<marker>%s\n", oname(a));
	}
    }
}

dumpitems()
{
    dumpstuff(mynum, ploc(mynum));
}

dumpstuff(n, loc)
    int n, loc;
{
    int b;

    for (b = 0; b < numobs; b++)
	if (iscarrby(b, n))
	    setoloc(b, loc, 0);
}

whocom()
{
    whop2(0, 0, 47);
}

whop2(mode, st, end)
    int mode, st, end;
{
    int a;
    int bas;

    bas = 16;
    if (plev(mynum) > 9 && !mode) {
	bprintf("Players\n");
	bas = 64;
    }
    a = 0;
    if (mode) {
	bas = end;
	a = st;
    }
    for (; a < bas; a++) {
	if (!mode && a == 16)
	    bprintf("----------\nMobiles\n");
	if (EMPTY(pname(a)))
	    continue;
	if (seeplayer(a) && mode) {
	    bprintf("%-14s", pname(a));
	    if (mode)
		bprintf(ptstflg(a, 14) ? "*" : " ");
	}
	else
	    dispuser(a);
	if (mode && seeplayer(a)) {
	    if (plev(mynum) > 9)
		desrm(ploc(a), 0);
	    else
		bprintf("\n");
	}
    }
    bprintf("\n");
}

dispuser(ubase)
    int ubase;
{
    if (pstr(ubase) < 0 || pvis(ubase) > plev(mynum))
	return;
    if (pvis(ubase))
	bprintf("(");
    bprintf("%s ", pname(ubase));
    disl4(plev(ubase), psex(ubase));
    if (pvis(ubase))
	bprintf(")");
    if (ppos(ubase) == -2)
	bprintf(" [Absent From Reality]");
    bprintf("\n");
}

disle3(n, s)
    int n, s;
{
    disl4(n, s);
    bprintf("\n");
}

disl4(n, s)
    int n, s;				/* n is level, s is sex */
{
    FILE *fp;
    char line[150];
    int flag;
    

    if ((fp = fopen(LEVEL_FILE, "r")) == NULL)
	crapup("Wot! No levels...");
    for (flag = 0; fgets(line, sizeof line, fp); ) {
	unpack(line);
	if (n == u.level) {
	    flag = 1;
	    break;
	}
    }
    fclose(fp);
    if (!flag) {
	if (n >= 0)
	    bprintf("The Cardboard Box");
	return;
    }
    if (!*u.m_name)
	bprintf(u.f_name);
    else if (s)
	bprintf(u.f_name);
    else
	bprintf(u.m_name);
}

unpack(line)
    char *line;
{
    char c, *ptr2, *ptr = line;

    while (*ptr++ != ':');
    *(ptr - 1) = '\0';
    u.level = atoi(line);
    ptr2 = u.f_name;
    while ((c = *ptr++) != ':') {
	if (c == '\n') {
	    *u.m_name = '\0';
	    *ptr2 = '\0';
	    return;
	}
	*ptr2++ = c;
    }
    *ptr2 = '\0';
    ptr2 = u.m_name;
    while ((*ptr2++ = *ptr++) != '\n');
    *--ptr2 = '\0';
}

fpbn(name)
    char *name;
{
    int s;

    if ((s = fpbns(name)) == -1)
	return s;
    return seeplayer(s) ? s : -1;
}


fpbns(name)
    char *name;
{
    char n1[40], n2[40];
    register int a;

    for (a = 0; a < 64; a++) {
	lowercase(strcpy(n1, name));
	lowercase(strcpy(n2, pname(a)));
	lowercase(n2);
	if (!EMPTY(n2) && EQ(n1, n2))
	    return a;
	if (strncmp(n2, "the ", 4) == 0)
	    if (!EMPTY(n2) && EQ(n1, n2 + 4))
		return a;
    }
    return -1;
}


lispeople()
{
    int a;

    for (a = 0; a < 64; a++) {
	if (a == mynum)
	    continue;
	if (!EMPTY(pname(a)) && ploc(a) == ploc(mynum) && seeplayer(a)) {
	    if (a > 15) {
		bprintf("%s", pftxt[a - 16]);
		if (debug_mode)
		    bprintf("{%d}", a);
		if (gotanything(a))
		    bprintf("\n%s is", pname(a));
		else
		    bprintf("\n");
	    }
	    else {
		bprintf("%s ", pname(a));
		if (debug_mode)
		    bprintf("{%d}", a);
		disl4(plev(a), psex(a));
		if (psex(a))
		    strcpy(wd_her, pname(a));
		else
		    strcpy(wd_him, pname(a));
		bprintf(" is here");
		if (!gotanything(a))
		    bprintf(".\n");
	    }
	    if (gotanything(a)) {
		bprintf(" carrying\n");
		mlobjsat(a, 8);
	    }
	}
    }
}

usercom()
{
    whop2(1, 0, 15);
}

oplong(x)
    int x;
{
    if (debug_mode) {
	bprintf("{%d} %s\n", x, olongt(x, state(x)));
	return;
    }
    if (!EMPTY(olongt(x, state(x))))
	bprintf("%s\n", olongt(x, state(x)));
}




gotanything(x)
    int x;
{
    int ct;
    
    for (ct = 0; ct < numobs; ct++)
	if (iscarrby(ct, x))
	    return 1;
    return 0;
}

findclass(n)
    char *n;
{
    int a;
    
    for (a = 0; classnam[a]; a++)
	if (EQ(classnam[a], n))
	    return a;
    return -1;
}

classmatch(ob, cl)
    int ob, cl;
{
    int neg;

    if (cl == -1)
	return 1;
    neg = 0;
    if (class_data[cl * 2] == -999) {
	neg = 1;
	cl = class_data[cl * 2 + 1];
    }
    if (class_data[cl * 2 + 1] >= 0 && class_data[cl * 2 + 1] != state(ob))
	return neg;
    if (otstmask(ob, class_data[cl * 2]) == 0)
	return neg;
    return 1 - neg;
}