|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 16932 (0x4224) Types: TextFile Names: »motion.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/World/motion.c«
#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); }