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 m

⟦5ba69fe82⟧ TextFile

    Length: 16932 (0x4224)
    Types: TextFile
    Names: »motion.c«

Derivation

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

TextFile

#include "parame.inc"
#include "variab.h"
#include "arrays.h"
#include "trvtbl.inc"

/* World C Version 1.00 copyright 1987 J.D.McDonald 
   Use as you like for non-commercial purposes, but please
   leave this note, and document any changes you make as yours */

    static  int     rax[] = {556, 2445, 7552, 1105, 3111};
    static  int     dx[] = {2331, 4293, 2204, 6339, 3325};
    static  int     locx[] = {176, 177, 178, 179, 180};

vship()
{
    int             locy, i;

    if (wrdnum[0] == ACTIVA) {
	if ((loc < 175 || loc > 181) && loc != 184 && loc != 187)
	    speak(71);
	else if (lpill == 0)
	    speak(237);
	else if (obloc[YROD] != 2000 + YCLIP || obloc[BSAPPH] != BCLIP + 2000)
	    speak(539);
	else if ((obimpr[BDOOR] & 2) == 0)
	    speak(544);
	else if (spcloc != 2)
	    speak(542);
	else if (loc == 181 || loc == 184 || loc == 187) {
	    speak(536);
	    oldloc = 0;
	    oldlc2 = 0;
	    if (loc == 181)
		loc = 177;
	    else if (loc == 184)
		loc = 180;
	    else
		loc = 179;
	} else {
	    locy = 0;
	    for (i = 0; i < 5; i++) {
		if (rax[i] == raset && dx[i] == decset)
		    locy = locx[i];
	    }
	    if (locy == 0)
		speak(537);
	    else if (loc == locy)
		speak(500);
	    else {
		speak(538);
		if (loc == 175)
		    speak(545);
		for (i = 1; i <= MOVMAX; i++)
		    if (obloc[i] == loc)
			obloc[i] = locy;
		loc = locy;
		oldloc = 0;
		oldlc2 = 0;
	    }
	}
    } else if (loc < 176 || loc > 180)
	speak(71);
    else if (lpill == 0)
	speak(237);
    else if (obloc[YROD] != YCLIP + 2000 || obloc[BSAPPH]
	     != BCLIP + 2000)
	speak(539);
    else if ((obimpr[BDOOR] & 2) == 0)
	speak(544);
    else if (spcloc != 2)
	speak(542);
    else if (loc == 176)
	speak(540);
    else if (loc == 178)
	speak(541);
    else if (spcloc != 2)
	speak(543);
    else {
	oldloc = 0;
	oldlc2 = 0;
	speak(543);
	if (loc == 177)
	    locy = 181;
	else if (loc == 179)
	    locy = 187;
	else
	    locy = 184;
	for (i = 1; i <= MOVMAX; i++)
	    if (obloc[i] == loc)
		obloc[i] = locy;
	loc = locy;
    }
}


vcross()
{
    int             result;

    result = 0;
    /* the tree over the chasm */

    if ((loc == 19 || loc == 21) && (dobjs[0] == TREE ||
		       dobjs[0] == LOG || dobjs[0] == CHASM) && (prepdo == 0
			      || prepdo == OVER) && (iobj == TREE || iobj ==
						     LOG || iobj == 0)) {
	result = 1;
	prepdo = 0;
	dobjs[0] = NORTHE;
	if (loc == 21)
	    dobjs[0] = SOUTHW;
    }
    /* you can't "cross" the lake  */

    else if ((loc == 5 || loc == 6 || loc == 15 || loc == 17) && (
							 dobjs[0] == WATER))
	speak(47);
    else
	speak(94);
    return (result);
}


vcrawl()
{
    int             result;
    result = 0;
    /* you can crawl over the log   */

    if ((loc == 19 || loc == 21) && (dobjs[0] == TREE ||
				     dobjs[0] == LOG || dobjs[0] == CHASM) &&
	prepdo == OVER) {
	adverb = CAREFU;
	prepdo = 0;
	oldlc2 = oldloc;
	oldloc = loc;
	if (loc == 19)
	    loc = 21;
	else
	    loc = 19;
    }
    /* if "crawl direction" but not u or d, then call go  */

    else if (dobjs[0] <= NORTHW && prepdo == 0) {
	if (loc == 19 || loc == 21)
	    adverb = CAREFU;
	result = 1;
	speak(109);
    }
    /* otherwise, don't understand  */

    else
	speak(94);
    return (result);

}







vjump()
{
    int             result, ncarrd, nweigh, kcarrd, kweigh;
    result = 0;
    /* can't jump if dead */

    if (deadf) {
	speak(46);
	return (result);
    }
    /* jumping off the spire is fatal  */

    if ((loc == 13 || loc == 14) && ((dobjs[0] == SPIRE &&
				      prepdo == OFF) || dobjs[0] == 0)) {
	speak(49);
	speak(37);
	oldlc2 = 0;
	oldloc = 0;
	loc = 12;
	vdead();
	return (result);
    }
    /* trying to jump the chasm isn't too smart either  */

    if ((loc == 21 || loc == 19) && (dobjs[0] == 0 || ((dobjs[0] ==
		 CHASM || dobjs[0] == TREE || dobjs[0] == LOG) && (prepdo ==
						   0 || prepdo == OVER)))) {
	speak(49);
	speak(38);
	oldlc2 = 0;
	oldloc = 0;
	loc = 22;
	locdat[22] |= 16384;
	vdead();
	return (result);
    }
    /* but you can jump onto the tower  */

    if (loc == 48 && (dobjs[0] == 0 || dobjs[0] == TOWER) &&
	(prepdo == ON || prepdo == 0)) {
	/* if you're not carrying too much  */

	burden(&ncarrd, &nweigh, &kcarrd, &kweigh);
	if (ncarrd == 0 && (obloc[ZKNAPS] != 1000 && obloc[ZKNAPS]
			    != 3000) && wirelc[5] != 1000) {
	    speak(136);
	    oldlc2 = oldloc;
	    oldloc = loc;
	    loc = 49;
	} else
	    speak(139);

	return (result);
    }
    /* but not off the tower  */

    if ((loc == 49) && ((dobjs[0] == TOWER &&
			 prepdo == OFF) || dobjs[0] == 0)) {
	speak(49);
	speak(137);
	oldlc2 = 0;
	oldloc = 0;
	loc = 48;
	vdead();
	return (result);
    }
    /* jumping at the barrier   */

    if ((loc == 26 || loc == 27) && dobjs[0] == BARRIE) {
	if (prepdo == OVER || prepdo == 0) {
	    speak(170);
	    return (result);
	} else if (prepdo == THROUG) {
	    oldloc = 0;
	    oldlc2 = 0;
	    if (loc == 26)
		loc = 27;
	    else
		loc = 26;
	}
    }
    /* bottomless pit   */

    if (loc == 96) {
	oldloc = 0;
	oldlc2 = 0;
	if (dobjs[0] == TUNNEL)
	    loc = 102;
	else {
	    speak(266);
	    vdead();
	    loc = 97;
	}
    }
    /* wheeeeeee!!!  */

    speak(49);
    return (result);
}


vgo()
{
    int             aloc, xretr, dir, errno, nloc, k, kkk, indx1, ix;
    int             m, n, xgox, kk, indx2, s;


    /* the entrance to the cave at the waterfall */

    rmove = 0;
    if (prepdo == BEHIND && loc == 24 && dobjs[0] == HORSET) {
	horflg = 1;
	oldlc2 = oldloc;
	oldloc = loc;
	loc = 25;
	return;
    }
    aloc = loc;
    if (actor == ROBOT)
	aloc = obloc[ZROBOT];
    /* translate go through barrier to direction  */

    if (dobjs[0] == BARRIE && prepdo == THROUG) {
	prepdo = 0;
	if (aloc == 26)
	    dobjs[0] = NORTHE;
	else if (aloc == 19)
	    dobjs[0] = SOUTHW;
	else if (aloc == 62 || aloc == 50)
	    dobjs[0] = NORTH;
	else if (aloc == 86 || aloc == 63)
	    dobjs[0] = SOUTH;
	else if (aloc == 68)
	    dobjs[0] = WEST;
	else if (aloc == 90)
	    dobjs[0] = EAST;
	else
	    prepdo = THROUG;
    }
    /*

     * all prepositional expressions must be handled by special code above

     * this point  

     
*/

    if (prepdo > DOWN) {
	speak(94);
	return;
    }
    xretr = 0;
    dir = 0;
    errno = 0;
    if (prepdo == UP || prepdo == DOWN) {
	if (dobjs[0] == 0)
	    dir = prepdo + 9 - PRPMIN;
	else if (dobjs[0] > 0 && dobjs[0] <= NORTHW)
	    errno = 57;
	else if (dobjs[0] == SPIRE && (aloc >= 12 && aloc <= 14))
	    dobjs[0] = 0;
	else
	    errno = 28;
    } else if (dobjs[0] > 0 && dobjs[0] <= NORTHW)
	dir = dobjs[0] + 1 - NUNMIN;
    else
	errno = 28;
    if (errno != 0)
	goto lab9000;
    /****** we have reached the point where we use the travel table  */
    xgox = 0;
    k = dir;
    kkk = k;
    if (adverb == QUICKL)
	k = k + 64;
    if (adverb == SLOWLY)
	k = k + 32;
    if (adverb == CAREFU)
	k = k + 16;
    /*
     * if he says "go quickly" that will match "go quickly" or just "go" but
     * "go" will not match "go quickly" . same for other adverbs 
     */

    if (deadf)
	k = kkk;
    indx1 = dispat[aloc];
    indx2 = dispat[aloc + 1];
    for (ix = indx1; ix <= indx2 - 2; ix += 2)
	if (trvtbl[ix] == k || kkk == trvtbl[ix])
	    goto lab200;
    errno = 58;
    goto lab9000;
lab200:
    indx1 = ix + 1;
    m = trvtbl[indx1] / 512;
    n = trvtbl[indx1] - m * 512;
    if (actor != 1 && actor != ROBOT)
	return;
    else if (actor == ROBOT) {
	if (m == 1) {
	    xgox = 1;
	    nloc = n;
	} else if (m == 3 && n == 13 && aloc == 68) {
	    xgox = 1;
	    nloc = 90;
	} else if (m == 3 && n == 6 && aloc == 74) {
	    xgox = 1;
	    nloc = 70;
	} else;
    }
    /* unconditional motion */

    else if (m == 1) {
	xgox = 1;
	nloc = n;
	xretr = 1;
	/* unconditional stay where is */

    } else if (m == 2) {
	errno = n;
	/* forced to get out of chair */

	if (aloc == 184 || aloc == 187 || aloc == 166 ||
	    (aloc >= 175 && aloc <= 181))
	    spcloc = 0;
	else;
    } else if (m == 3) {
	/***    special conditions */

	if (n == 1) {
	    /*
	     * to climb the spire you must wear shoes, but nothing else, and
	     * it must be daytime  
             */

	    if (daytim == 0 || (turns % 100) > 73) {
		speak(123);
		return;
	    }
	    if (obloc[CSHOES] == 3000) {
		for (kk = 1; kk <= MOVMAX; kk++) {
		    if (kk == CSHOES)
			continue;
		    if (obloc[kk] == 1000 || (obloc[kk] == 3000 && kk != CKEY))
			errno = 60;
		}
		if (errno != 60) {
		    xgox = 1;
		    nloc = 13;
		}
	    }
	}
	/* to get behind the horsetails */

	else if (n == 2) {
	    if (horflg || (locdat[25] & 16384) != 0) {
		xgox = 1;
		nloc = 25;
	    }
	}
	/* into the bar  */

	else if (n == 3) {
	    if (daytim == 1 || deadf) {
		xgox = 1;
		xretr = 1;
		nloc = 42;
	    } else if (marflg[0]) {
		speak(128);
		return;
	    }
	}
	/* underground from mars */

	else if (n == 4 || n == 11) {
	    if ((obimpr[MDOOR] & 2) == 0) {
		xgox = 1;
		xretr = 1;
		nloc = 135;
		if (n == 11)
		    nloc = 41;
	    }
	} else if (n == 5) {
	    /* warehouse  */

	    if ((obimpr[RDOOR] & 2) != 2) {
		xgox = 1;
		xretr = 0;
		nloc = 47;
		if (aloc == 47)
		    nloc = 51;
	    }
	} else if (n == 6) {
	    if ((obimpr[ZVINE] & 56) == 16) {
		xgox = 1;
		nloc = 70;
		xretr = 1;
	    }
	} else if (n == 7) {
	    /* rabbit hole  */

	    if (obimpr[RHOLE] == 17) {
		xgox = 1;
		nloc = 96;
	    }
	} else if (n == 8) {
	    /* going down the pole c */

	    if ((obimpr[ZLATEX] & 56) == 24) {
		xgox = 1;
		nloc = 80;
	    }
	} else if (n == 9 || n == 12) {
	    /* glass door  */

	    if ((obimpr[GDOOR] & 2) == 0) {
		xgox = 1;
		xretr = 1;
		nloc = 136;
		if (aloc == 136)
		    nloc = 85;
	    }
	}
	/* beehive  */

	else if (n == 10) {
	    if (obimpr[ZDEET] >= 4096) {
		xgox = 1;
		nloc = 88;
		if (aloc == 88)
		    nloc = 87;
	    }
	} else if (n == 13);
	else if (n == 14) {
	    if (obimpr[ZLOUVE] == 9) {
		xgox = 1;
		xretr = 1;
		nloc = 142;
		if (aloc == 142)
		    nloc = 98;
	    }
	}
	/* the scree slope  */

	else if (n == 15) {
	    if (screef > 0) {
		xgox = 1;
		xretr = 1;
		nloc = 151;
	    }
	} else if (n == 16) {
	    if ((obimpr[ODOOR] & 2) == 0) {
		xgox = 1;
		xretr = 1;
		nloc = 166;
		if (aloc == 166)
		    nloc = 165;
	    }
	} else if (n == 17) {
	    if ((obimpr[BDOOR] & 2) == 0) {
		xgox = 1;
		xretr = 1;
		if (aloc == 174)
		    nloc = 175;
		else if (aloc == 175)
		    nloc = 174;
		else if (aloc == 181)
		    nloc = 182;
		else if (aloc == 184)
		    nloc = 185;
		else if (aloc == 187)
		    nloc = 188;
		else;
	    }
	} else if (n == 18) {
	    if (obimpr[HMURAL] == 209) {
		xgox = 1;
		xretr = 1;
		nloc = 170;
	    }
	} else {
	    linout("bug in travel table", 19);
	    return;
	}
    }
    /***    end special conditions

            he dies. code give his final location */

    else if (m == 4) {
	if (deadf)
	    errno = 46;
	else {
	    oldlc2 = 0;
	    oldloc = 0;
	    if (loc == 13 || loc == 14)
		loc = 12;
	    if (loc == 19 || loc == 21)
		loc = 22;
	    if (loc == 76)
		loc = 79;
	    /* if he moved when he dies, special code goes here  */

	    locdat[loc] |= 16384;
	    vdead();
	    if (loc == 96) {
		loc = 97;
		locdat[97] |= 16384;
	    }
	    errno = n;
	}
    }
    /* goes to newloc if he is dead and has been there before */

    else if (m == 5) {
	if (deadf && (locdat[n] & 16384) != 0) {
	    xgox = 1;
	    nloc = n;
	}
    }
    /* motion with some probability */

    else if (m >= 16 && m <= 31) {
	s = (m - 15) * 6;
	if (pct(s)) {
	    xgox = 1;
	    nloc = n;
	}
    } else {
	speak(252);
	return;
    }


    if (errno != 0)
	goto lab9000;
    if (xgox && actor == 1) {
	if ((locdat[nloc] & 25) == 0 && obloc[25] != 1000 && !deadf)
	    errno = 258;
	else if ((locdat[nloc] & 32) != 0) {
	    oldlc2 = oldloc;
	    oldloc = loc;
	    loc = nloc;
	    if (!xretr || loc == 38 || loc == 97 || loc == 127
		|| loc == 88 || loc == 74 || loc == 96) {
		oldloc = 0;
		oldlc2 = 0;
	    }
	} else
	    errno = 59;
    } else if (xgox && actor == ROBOT) {
	if ((locdat[nloc] & 64) != 0) {
	    obloc[ZROBOT] = nloc;
	    rmove = 1;
	} else
	    errno = 299;
    } else {
	ix = indx1 + 1;
	if (trvtbl[ix] == kkk || trvtbl[ix] == k)
	    goto lab200;
	errno = 58;
	if (actor == 1)
	    errno = 299;
    }
    /***   all errors and "you are dead" or "impossibility" messages go here */

lab9000:
    if (errno != 0)
	speak(errno);
}



vretre()
/* retreat or back */

{
    if (oldloc == 0)
	speak(65);
    else {
	loc = oldloc;
	oldloc = oldlc2;
	oldlc2 = 0;
    }
}

vclimb()
{
    int             result;

    result = 0;
    /*

     * if result is 1 call vgo rubber tree jungle trees 

     
*/

    if ((loc == 64 || loc == 67) && (dobjs[0] == TREE || dobjs[0]
				     == 0))
	speak(430);
    else if ((loc == 78 || loc == 79) && (dobjs[0] == TREE || dobjs[0]
					  == 0))
	speak(431);
    else if (loc == 65 && (prepdo == 0 || prepdo == UP) && (dobjs[0]
						== TREE || dobjs[0] == 0)) {
	oldlc2 = oldloc;
	oldloc = loc;
	loc = 66;
    } else if (loc == 66 && (prepdo == DOWN || prepdo == 0) && (dobjs[0]
						== 0 || dobjs[0] == TREE)) {
	oldlc2 = oldloc;
	oldloc = loc;
	loc = 65;
    }
    /* pole  */

    else if ((loc == 80 || loc == 79 || loc == 76) && (dobjs[0] == POLE
						       || dobjs[0] == 0)) {
	result = 1;
	wrdnum[0] = GO;
	dobjs[0] = 0;
	if (prepdo == 0)
	    prepdo = UP;
    }
    /*

     * you can climb the spire if you are careful but the actual motion is

     * done by "vgo" 

     
*/

    else if ((loc >= 12 && loc <= 14) && (dobjs[0] == 0 || dobjs[0]
					  == SPIRE)) {
	wrdnum[0] = GO;
	dobjs[0] = 0;
	result = 1;
	if ((loc == 12 && (prepdo == 0 || prepdo == UP)) ||
	    (loc == 13 && (prepdo == 0 || prepdo == UP)))
	    prepdo = UP;
	else if (((loc == 13 || loc == 14) && prepdo == DOWN) ||
		 (loc == 14 && prepdo == 0))
	    prepdo = DOWN;
	else;
    }
    /* you can climb over the log but not up a tree!  */

    else if (loc == 19 || loc == 21) {
	if ((dobjs[0] == TREE || dobjs[0] == LOG) && prepdo == OVER) {
	    prepdo = 0;
	    result = 1;
	    dobjs[0] = NORTHE;
	    {
		if (loc == 21)
		    dobjs[0] = SOUTHW;
	    }
	} else if (dobjs[0] == TREE && (prepdo == UP || prepdo == 0))
	    speak(108);
	else
	    speak(94);
    }
    /* you can't climb the tower  */

    else if (loc == 48 && (prepdo == 0 || prepdo == UP) &&
	     (dobjs[0] == 0 || dobjs[0] == TOWER))
	speak(138);
    /* but you can climb down the tower */

    else if (loc == 49 && (prepdo == 0 || prepdo == DOWN) &&
	     (dobjs[0] == TOWER || dobjs[0] == 0)) {
	oldlc2 = oldloc;
	oldloc = loc;
	loc = 48;
    }
    /* you can't climb the barrier  */

    else if ((loc == 26 || loc == 27) && dobjs[0] == BARRIE)
	speak(170);
    else if (dobjs[0] == TREE) {
	if ((locdat[loc] & 2048) == 2048)
	    speak(244);
	else
	    speak(245);
    } else if (loc == 20 || (loc >= 52 && loc <= 56)) {
	wrdnum[0] = GO;
	{
	    if (prepdo == 0)
		prepdo = UP;
	}
	result = 1;
    } else
	speak(50);
    return (result);
}


vrun()
{
    int             result;
    result = 0;
    /* ru translates to "go quickly"  */

    if (adverb == SLOWLY)
	speak(51);
    else {
	result = 1;
	adverb = QUICKL;
	wrdnum[0] = GO;
    }
    return (result);
}


vswim()
{
    int             spk, m, i, xloc;
    spk = 0;
    /* he can't swim at night (for no real reason)  */

    if (daytim == 0 && (loc == 5 || loc == 6 || loc == 15 || loc
			== 17))
	spk = 122;
    /* he can't swim while dead */

    else if (deadf)
	spk = 46;
    /* you must swim in the lake or poool  */

    else if ((loc < 5 || loc > 17 || (loc > 6 && loc < 15))
	     && loc != 122)
	spk = 52;
    else;
    if (spk != 0) {
	speak(spk);
	return (0);
    }
    m = dobjs[0];
    if ((m == WATER && prepdo != IN) || ((m == ISLAND || m == SHORE)
			    && prepdo != TO) || (m == POOL && prepdo != IN))
	spk = 28;
    else if ((loc == 5 && (m == WEST || m == ISLAND)) ||
	     (loc == 15 && m == EAST) ||
	     (loc == 16 && m == SOUTH))
	xloc = 6;
    else if (loc == 6 && (m == EAST || m == SHORE))
	xloc = 5;
    else if ((loc == 6 && m == NORTH) ||
	     (loc == 17 && (m == SOUTH || m == ISLAND)) ||
	     (loc == 16 && m == WEST))
	xloc = 15;
    else if ((loc == 6 && m == SOUTH) || (loc == 15 && m == WEST))
	xloc = 16;
    else if (loc == 15 && (m == NORTH || m == SHORE))
	xloc = 17;
    else if ((loc == 5 || loc == 6 || (loc <= 17 && loc >= 15))
	     && (m == WATER)) {
	if (dirty < 10)
	    spk = 110;
	else
	    spk = 111;
    } else if (loc == 122 && m == POOL)
	xloc = 123;
    else
	spk = 54;
    if (spk == 0) {
	/* but not if you are wearing too much  */

	for (i = 1; i <= MOVMAX; i++) {
	    if (i == CSHOES || i == CKEY || i == CFISH || i == DFISH
		|| i == BNET || i == GSPHER)
		continue;
            if(obloc[i] == 1000 || obloc[i] == 3000) {
        	speak(53);
	        return (0);
            }
	}
	oldlc2 = 0;
	oldloc = 0;
	loc = xloc;
	return (0);
    }
    speak(spk);
    return (0);
}