|
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: 5670 (0x1626) Types: TextFile Names: »monsters.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Rog-O-Matic/monsters.c«
/* * monsters.c: Rog-O-Matic XIV (CMU) Thu Jan 31 20:23:07 1985 - mlm * Copyright (C) 1985 by A. Appel, G. Jacobson, L. Hamey, and M. Mauldin * * This file contains all of the monster specific functions. */ # include <stdio.h> # include <ctype.h> # include <curses.h> # include "types.h" # include "globals.h" # define ADJACENT(m) (max (abs (mlist[m].mrow - atrow),\ abs (mlist[m].mcol - atcol)) == 1) /* * monname: Return a monster name given letter '@ABC..Z' */ char *monname (m) char m; { return (monhist[monindex[m-'A'+1]].m_name); } /* * addmonster: add a monster to this level. Remove any monsters on the * list which are in the same square. */ addmonster (ch, row, col, quiescence) char ch; int row, col, quiescence; { char *monster = monname (ch); if (row > 1 || col > 3) { if (isholder (monster)) quiescence = AWAKE; deletemonster (row, col); mlist[mlistlen].chr = ch; mlist[mlistlen].mrow = row; mlist[mlistlen].mcol = col; mlist[mlistlen].q = quiescence; if (++mlistlen >= MAXMONST) dwait (D_FATAL, "Too many monsters"); setrc (MONSTER, row, col); lyinginwait = 0; new_arch = 1; /* If we can see it, it is not really invisible */ if (stlmatch (monster, "invisible") || streq (monster, "phantom")) beingstalked = 0; } } /* * deletemonster: remove a monster from the list at location (row, col). */ deletemonster (row, col) int row, col; { int i; new_arch = 1; unsetrc (MONSTER, row, col); for (i = 0; i < mlistlen; ++i) if (mlist[i].mcol == col && mlist[i].mrow == row) { mlist[i] = mlist[--mlistlen]; i--; } } /* * dumpmonsters: (debugging) dump the list of monsters on this level. */ dumpmonster () { int i; at (1, 0); for (i = 0; i < mlistlen; ++i) printw ("%s at %d,%d(%c) \n", mlist[i].q == AWAKE ? "alert" : mlist[i].q == ASLEEP ? "sleeping" : mlist[i].q == HELD ? "held" : "unknown", mlist[i].mrow, mlist[i].mcol, mlist[i].chr); printw ("You are at %d,%d.", atrow, atcol); at (row, col); } /* * sleepmonster: Turn all unknown monsters into sleeping monsters. * This routine is called after we have executed a command, so if * the value of ASLEEP is not overridden by the monsters movement, * it sat still for a turn and must be asleep. */ sleepmonster () { register int m; for (m = 0; m < mlistlen; ++m) { if (mlist[m].q == 0 && ! ADJACENT (m)) { dwait (D_MONSTER, "Found a sleeping %s at %d,%d", monname (mlist[m].chr), mlist[m].mrow, mlist[m].mcol); mlist[m].q = ASLEEP; } } } /* * holdmonsters: Mark all close monsters as being held. */ holdmonsters () { register int m; for (m = 0; m < mlistlen; ++m) { if (mlist[m].q == 0 && (max (abs (mlist[m].mrow - atrow), abs (mlist[m].mcol - atcol)) < 3)) { dwait (D_MONSTER, "Holding %s at %d,%d", monname (mlist[m].chr), mlist[m].mrow, mlist[m].mcol); mlist[m].q = HELD; } } } /* * wakemonster: Turn monsters into waking monsters * * dir = 0-7 means wake up adjacent plus monster in that dir * dir = 8 means wake up only adjacent monster * dir = ALL means wake up all monsters * dir = -m means wake up all adjacent monsters of type m. */ wakemonster (dir) int dir; { register int m; for (m = 0; m < mlistlen; ++m) { if (mlist[m].q != AWAKE && (dir == ALL || (dir < 0 && ADJACENT(m) && mlist[m].chr == -dir + 'A' - 1) || (dir >= 0 && dir < 8 && mlist[m].mrow == atdrow(dir) && mlist[m].mcol == atdcol(dir)))) { dwait (D_MONSTER, "Waking up %s at %d,%d", monname (mlist[m].chr), mlist[m].mrow, mlist[m].mcol); mlist[m].q = AWAKE; setrc (EVERCLR, mlist[m].mrow, mlist[m].mcol); } } } /* * seemonster: Return true if a particular monster is on the monster list. */ seemonster (monster) char *monster; { register int m; for (m = 0; m < mlistlen; ++m) if (streq (monname (mlist[m].chr), monster)) return (1); return (0); } /* * seeawakemonster: Returns true if there is a particular awake * monster on the monster list. DR UTexas 26 Jan 84 */ seeawakemonster (monster) char *monster; { register int m; for (m = 0; m < mlistlen; ++m) if (streq (monname (mlist[m].chr), monster) && mlist[m].q == AWAKE) return (1); return (0); } /* * monsternum: Given a string e.g. "umber hulk", return the monster * number from 0 to 26, e.g. "umber hulk" ==> 21. Zero * is used for unknown monsters (e.g. "it"). */ monsternum (monster) char *monster; { int m, mh; if ((mh = findmonster (monster)) != NONE) for (m=0; m<=26; m++) if (monindex[m] == mh) return (m); return (0); } /* * newmonsterlevel: Starting a new level. Set the initial sleep status of * each monster. */ newmonsterlevel () { register int m; register char *monster; for (m=0; m<mlistlen; m++) { monster = monname (mlist[m].chr); if (streq (monster, "floating eye") || streq (monster, "leprechaun") || streq (monster, "nymph") || streq (monster, "ice monster")) mlist[m].q = ASLEEP; else mlist[m].q = 0; } } /* * isholder: Return true if the monster can hold us. */ isholder (monster) register char *monster; { return (streq (monster, "venus flytrap") || streq (monster, "violet fungi")); } /* * stubs for Leonards stuff. These are to be replaced with code which * determines what monsters we have seen that are not now on the screen. */ domonster () {} donemonster () {} killmonster () {}