home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol045 / demons.ftn < prev    next >
Encoding:
Text File  |  1984-04-29  |  18.2 KB  |  600 lines

  1. C FIGHTD- INTERMOVE FIGHT DEMON
  2. C
  3. C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
  4. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  5. C WRITTEN BY R. M. SUPNIK
  6. C
  7. C DECLARATIONS
  8. C
  9.     SUBROUTINE FIGHTD
  10.     IMPLICIT INTEGER (A-Z)
  11.     LOGICAL PROB,OAPPLI
  12. C
  13. C PARSER OUTPUT
  14. C
  15.     LOGICAL PRSWON
  16.     COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
  17. C
  18. C GAME STATE
  19. C
  20.     LOGICAL TELFLG
  21.     COMMON /PLAY/ WINNER,HERE,TELFLG
  22. C
  23. C OBJECTS
  24. C
  25.     COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
  26.     1    OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
  27.     2    OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
  28.     3    OADV(220),OCAN(220),OREAD(220)
  29. C
  30.     COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
  31.     1    NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
  32.     2    TOOLBT,TURNBT,ONBT
  33.     COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
  34.     1    WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
  35.     2    TCHBT,VEHBT,SCHBT
  36. C
  37.     COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
  38.     COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
  39.     COMMON /OINDEX/    LEAVE,TROLL,AXE
  40.     COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
  41.     COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
  42.     COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
  43.     COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
  44.     COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
  45.     COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
  46.     COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
  47.     COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
  48.     COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
  49.     COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
  50.     COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
  51.     COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
  52.     COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
  53.     COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
  54.     COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
  55.     COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
  56.     COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR
  57.     COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
  58.     COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
  59. C
  60. C VILLAINS AND DEMONS
  61. C
  62.     COMMON /VILL/ VLNT,VILLNS(4),VPROB(4),VOPPS(4),VBEST(4),VMELEE(4)
  63. C
  64. C ADVENTURERS
  65. C
  66.     COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
  67.     1    AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
  68. C
  69.     COMMON /AFLAGS/ ASTAG
  70. C
  71.     COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
  72. C
  73. C VERBS
  74. C
  75.     COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
  76.     COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
  77.     COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
  78.     COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
  79.     COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
  80.     COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
  81.     COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
  82.     COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
  83.     COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
  84.     COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
  85.     COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
  86.     COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
  87.     COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
  88. C
  89. C FLAGS
  90. C
  91.     LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
  92.     LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
  93.     LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
  94.     LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
  95.     LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
  96.     LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
  97.     LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
  98.     LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF
  99.     COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
  100.     1    DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
  101.     2    MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
  102.     3    EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
  103.     4    GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
  104.     5    GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
  105.     6    MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
  106.     7    FOLLWF,SPELLF,CPOUTF,CPUSHF
  107.     COMMON /FINDEX/ BTIEF,BINFF
  108.     COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA
  109.     COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP
  110.     COMMON /FINDEX/ MDIR,MLOC,POLEUF
  111.     COMMON /FINDEX/ QUESNO,NQATT,CORRCT
  112.     COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE
  113. C
  114. C FUNCTIONS AND DATA
  115. C
  116.     DATA ROUT/1/
  117. C FIGHTD, PAGE 2
  118. C
  119.     DO 2400 I=1,VLNT            !LOOP THRU VILLAINS.
  120.       VOPPS(I)=0                !CLEAR OPPONENT SLOT.
  121.       OBJ=VILLNS(I)                !GET OBJECT NO.
  122.       RA=OACTIO(OBJ)            !GET HIS ACTION.
  123.       IF(HERE.NE.OROOM(OBJ)) GO TO 2200    !ADVENTURER STILL HERE?
  124.       IF((OBJ.EQ.THIEF).AND.THFENF) GO TO 2400 !THIEF ENGROSSED?
  125.       IF(OCAPAC(OBJ).GE.0) GO TO 2050    !YES, VILL AWAKE?
  126.       IF((VPROB(I).EQ.0).OR..NOT.PROB(VPROB(I),VPROB(I)))
  127.     1    GO TO 2025            !NO, SEE IF WAKES UP.
  128.       OCAPAC(OBJ)=IABS(OCAPAC(OBJ))
  129.       VPROB(I)=0
  130.       IF(RA.EQ.0) GO TO 2400        !ANYTHING TO DO?
  131.       PRSA=INXW                !YES, WAKE HIM UP.
  132.       F=OAPPLI(RA,0)
  133.       GO TO 2400                !NOTHING ELSE HAPPENS.
  134. C
  135. 2025      VPROB(I)=VPROB(I)+10            !INCREASE WAKEUP PROB.
  136.       GO TO 2400                !NOTHING ELSE.
  137. C
  138. 2050      IF((OFLAG2(OBJ).AND.FITEBT).EQ.0) GO TO 2100
  139.       VOPPS(I)=OBJ                !FIGHTING, SET UP OPP.
  140.       GO TO 2400
  141. C
  142. 2100      IF(RA.EQ.0) GO TO 2400        !NOT FIGHTING,
  143.       PRSA=FRSTQW                !SET UP PROBABILITY
  144.       IF(.NOT.OAPPLI(RA,0)) GO TO 2400    !OF FIGHTING.
  145.       OFLAG2(OBJ)=OFLAG2(OBJ).OR.FITEBT
  146.       VOPPS(I)=OBJ                !SET UP OPP.
  147.       GO TO 2400
  148. C
  149. 2200      IF(((OFLAG2(OBJ).AND.FITEBT).EQ.0).OR.(RA.EQ.0))
  150.     1    GO TO 2300            !NOTHING TO DO.
  151.       PRSA=FIGHTW                !HAVE A FIGHT.
  152.       F=OAPPLI(RA,0)
  153. 2300      IF(OBJ.EQ.THIEF) THFENF=.FALSE.    !TURN OFF ENGROSSED.
  154.       AFLAG(PLAYER)=AFLAG(PLAYER).AND. .NOT.ASTAG
  155.       OFLAG2(OBJ)=OFLAG2(OBJ).AND. .NOT.(STAGBT+FITEBT)
  156.       IF((OCAPAC(OBJ).GE.0).OR.(RA.EQ.0))
  157.     1    GO TO 2400
  158.       PRSA=INXW                !WAKE HIM UP.
  159.       F=OAPPLI(RA,0)
  160.       OCAPAC(OBJ)=IABS(OCAPAC(OBJ))
  161. 2400    CONTINUE
  162. C FIGHTD, PAGE 3
  163. C
  164. C NOW DO ACTUAL COUNTERBLOWS.
  165. C
  166.     OUT=0                    !ASSUME HERO OK.
  167. 2600    DO 2700 I=1,VLNT            !LOOP THRU OPPS.
  168.       J=VOPPS(I)
  169.       IF(J.EQ.0) GO TO 2700            !SLOT EMPTY?
  170.       PRSCON=1                !STOP CMD STREAM.
  171.       RA=OACTIO(J)
  172.       IF(RA.EQ.0) GO TO 2650        !VILLAIN ACTION?
  173.       PRSA=FIGHTW                !SEE IF
  174.       IF(OAPPLI(RA,0)) GO TO 2700        !SPECIAL ACTION.
  175. 2650      RES=BLOW(PLAYER,J,VMELEE(I),.FALSE.,OUT) !STRIKE BLOW.
  176.       IF(RES.LT.0) RETURN            !IF HERO DEAD, EXIT.
  177.       IF(RES.EQ.ROUT) OUT=2+RND(3)        !IF HERO OUT, SET FLG.
  178. 2700    CONTINUE
  179.     OUT=OUT-1                !DECREMENT OUT COUNT.
  180.     IF(OUT.GT.0) GO TO 2600            !IF STILL OUT, GO AGAIN.
  181.     RETURN
  182. C
  183.     END
  184. C BLOW- STRIKE BLOW
  185. C
  186. C DECLARATIONS
  187. C
  188.     INTEGER FUNCTION BLOW(H,V,RMK,HFLG,OUT)
  189.     IMPLICIT INTEGER (A-Z)
  190.     LOGICAL HFLG,OAPPLI,PROB
  191.     INTEGER DEF1R(3),DEF2R(4),DEF3R(5)
  192.     INTEGER RVECTR(66),RSTATE(45)
  193. C
  194. C GAME STATE
  195. C
  196.     LOGICAL TELFLG
  197.     COMMON /PLAY/ WINNER,HERE,TELFLG
  198. C
  199. C PARSE VECTOR
  200. C
  201.     LOGICAL PRSWON
  202.     COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
  203. C
  204. C MISCELLANEOUS VARIABLES
  205. C
  206.     COMMON /STAR/ MBASE,STRBIT
  207. C
  208. C OBJECTS
  209. C
  210.     COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
  211.     1    OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
  212.     2    OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
  213.     3    OADV(220),OCAN(220),OREAD(220)
  214. C
  215.     COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
  216.     1    NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
  217.     2    TOOLBT,TURNBT,ONBT
  218.     COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
  219.     1    WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
  220.     2    TCHBT,VEHBT,SCHBT
  221. C
  222. C
  223. C CLOCK INTERRUPTS
  224. C
  225.     LOGICAL*1 CFLAG
  226.     COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
  227. C
  228.     COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND,
  229.     1    CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG,
  230.     2    CEVGNO,CEVBUC,CEVSPH,CEVEGH,
  231.     3    CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE,
  232.     5    CEVMRS,CEVPIN,CEVINQ,CEVFOL
  233.  
  234. C
  235. C ADVENTURERS
  236. C
  237.     COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
  238.     1    AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
  239. C
  240.     COMMON /AFLAGS/ ASTAG
  241. C
  242.     COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
  243. C
  244. C VERBS
  245. C
  246.     COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
  247.     COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
  248. C
  249. C FUNCTIONS AND DATA
  250. C
  251.     DATA RMISS/0/,ROUT/1/,RKILL/2/,RLIGHT/3/
  252.     DATA RSER/4/,RSTAG/5/,RLOSE/6/,RHES/7/,RSIT/8/
  253.     DATA DEF1R/1,2,3/
  254.     DATA DEF2R/13,23,24,25/
  255.     DATA DEF3R/35,36,46,47,57/
  256. C
  257.     DATA RVECTR/0,0,0,0,5,5,1,1,2,2,2,2,
  258.     1    0,0,0,0,0,5,5,3,3,1,
  259.     2    0,0,0,5,5,3,3,3,1,2,2,2,
  260.     3    0,0,0,0,0,5,5,3,3,4,4,
  261.     4    0,0,0,5,5,3,3,3,4,4,4,
  262.     5    0,5,5,3,3,3,3,4,4,4/
  263.     DATA RSTATE/5000,3005,3008,4011,3015,3018,1021,0,0,
  264.     1    5022,3027,3030,4033,3037,3040,1043,0,0,
  265.     2    4044,2048,4050,4054,5058,4063,4067,3071,1074,
  266.     3    4075,1079,4080,4084,4088,4092,4096,4100,1104,
  267.     4    4105,2109,4111,4115,4119,4123,4127,3131,3134/
  268. C BLOW, PAGE 3
  269. C
  270.     RA=OACTIO(V)                !GET VILLAIN ACTION,
  271.     DV=ODESC2(V)                !DESCRIPTION.
  272.     BLOW=RMISS                !ASSUME NO RESULT.
  273. D    TYPE 10,H,V,RMK,HFLG,OUT
  274. D10    FORMAT(' BLOW 10-- ',3I7,L7,I7)
  275.     IF(.NOT.HFLG) GO TO 1000        !HERO STRIKING BLOW?
  276. C
  277. C HERO IS ATTACKER, VILLAIN IS DEFENDER.
  278. C
  279.     PBLOSE=10                !BAD LK PROB.
  280.     OFLAG2(V)=OFLAG2(V).OR.FITEBT        !YES, VILLAIN GETS MAD.
  281.     IF((AFLAG(H).AND.ASTAG).EQ.0) GO TO 100    !HERO STAG?
  282.     CALL RSPEAK(591)            !YES, CANT FIGHT.
  283.     AFLAG(H)=AFLAG(H).AND. .NOT.ASTAG
  284.     RETURN
  285. C
  286. 100    ATT=FIGHTS(H,.TRUE.)            !GET HIS STRENGTH.
  287.     OA=ATT
  288.     DEF=VILSTR(V)                !GET VILL STRENGTH.
  289.     OD=DEF
  290.     DWEAP=0                    !ASSUME NO WEAPON.
  291.     DO 200 I=1,OLNT                !SEARCH VILLAIN.
  292.       IF((OCAN(I).EQ.V).AND.((OFLAG2(I).AND.WEAPBT).NE.0))
  293.     1    DWEAP=I
  294. 200    CONTINUE
  295.     IF(V.EQ.AOBJ(PLAYER)) GO TO 300        !KILLING SELF?
  296.     IF(DEF.NE.0) GO TO 2000            !DEFENDER ALIVE?
  297.     CALL RSPSUB(592,DV)            !VILLAIN DEAD.
  298.     RETURN
  299. C
  300. 300    CALL JIGSUP(593)            !KILLING SELF.
  301.     RETURN
  302. C
  303. C VILLAIN IS ATTACKER, HERO IS DEFENDER.
  304. C
  305. 1000    PBLOSE=50                !BAD LK PROB.
  306.     AFLAG(H)=AFLAG(H).AND..NOT.ASTAG    !VILL STRIKING.
  307.     IF((OFLAG2(V).AND.STAGBT).EQ.0) GO TO 1200 !VILL STAGGERED?
  308.     OFLAG2(V)=OFLAG2(V).AND. .NOT.STAGBT    !MAKE HIM OK.
  309.     CALL RSPSUB(594,DV)            !DESCRIBE.
  310.     RETURN
  311. C
  312. 1200    ATT=VILSTR(V)                !SET UP ATT, DEF.
  313.     OA=ATT
  314.     DEF=FIGHTS(H,.TRUE.)
  315.     IF(DEF.LE.0) RETURN            !DONT ALLOW DEAD DEF.
  316.     OD=FIGHTS(H,.FALSE.)
  317.     DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.))    !FIND A WEAPON.
  318. C BLOW, PAGE 4
  319. C
  320. C PARTIES ARE NOW EQUIPPED.  DEF CANNOT BE ZERO.
  321. C ATT MUST BE > 0.
  322. C
  323. 2000    CONTINUE
  324. D    TYPE 2050,ATT,OA,DEF,OD,DWEAP
  325. D2050    FORMAT(' BLOW 2050-- ',5I7)
  326.     IF(DEF.GT.0) GO TO 2100            !DEF ALIVE?
  327.     RES=RKILL
  328.     IF(HFLG) CALL RSPSUB(595,DV)        !DEADER.
  329.     GO TO 3000
  330. C
  331. 2100    IF(DEF-2) 2200,2300,2400        !DEF <2,=2,>2
  332. 2200    ATT=MIN0(ATT,3)                !SCALE ATT.
  333.     TBL=DEF1R(ATT)                !CHOOSE TABLE.
  334.     GO TO 2500
  335. C
  336. 2300    ATT=MIN0(ATT,4)                !SCALE ATT.
  337.     TBL=DEF2R(ATT)                !CHOOSE TABLE.
  338.     GO TO 2500
  339. C
  340. 2400    ATT=ATT-DEF                !SCALE ATT.
  341.     ATT=MIN0(2,MAX0(-2,ATT))+3
  342.     TBL=DEF3R(ATT)
  343. C
  344. 2500    RES=RVECTR(TBL+RND(10))            !GET RESULT.
  345.     IF(OUT.EQ.0) GO TO 2600            !WAS HE OUT?
  346.     IF(RES.EQ.RSTAG) GO TO 2550        !YES, STAG--> HES.
  347.     RES=RSIT                !OTHERWISE, SITTING.
  348.     GO TO 2600
  349. 2550    RES=RHES
  350. 2600    IF((RES.EQ.RSTAG).AND.(DWEAP.NE.0).AND.PROB(25,PBLOSE))
  351.     1    RES=RLOSE            !LOSE WEAPON.
  352. C
  353.     MI=RSTATE(((RMK-1)*9)+RES+1)        !CHOOSE TABLE ENTRY.
  354.     IF(MI.EQ.0) GO TO 3000
  355.     I=(MOD(MI,1000)+RND(MI/1000))+MBASE+1
  356.     J=DV
  357.     IF(.NOT.HFLG .AND.(DWEAP.NE.0)) J=ODESC2(DWEAP)
  358. D    TYPE 2650,RES,MI,I,J,MBASE
  359. D2650    FORMAT(' BLOW 2650-- ',5I7)
  360.     CALL RSPSUB(I,J)            !PRESENT RESULT.
  361. C BLOW, PAGE 5
  362. C
  363. C NOW APPLY RESULT
  364. C
  365. 3000    GO TO (4000,3100,3200,3300,3400,3500,3600,4000,3200),RES+1
  366. C
  367. 3100    IF(HFLG) DEF=-DEF            !UNCONSCIOUS.
  368.     GO TO 4000
  369. C
  370. 3200    DEF=0                    !KILLED OR SITTING DUCK.
  371.     GO TO 4000
  372. C
  373. 3300    DEF=MAX0(0,DEF-1)            !LIGHT WOUND.
  374.     GO TO 4000
  375. C
  376. 3400    DEF=MAX0(0,DEF-2)            !SERIOUS WOUND.
  377.     GO TO 4000
  378. C
  379. 3500    IF(HFLG) GO TO 3550            !STAGGERED.
  380.     AFLAG(H)=AFLAG(H).OR.ASTAG
  381.     GO TO 4000
  382. C
  383. 3550    OFLAG2(V)=OFLAG2(V).OR.STAGBT
  384.     GO TO 4000
  385. C
  386. 3600    CALL NEWSTA(DWEAP,0,HERE,0,0)        !LOSE WEAPON.
  387.     DWEAP=0
  388.     IF(HFLG) GO TO 4000            !IF HERO, DONE.
  389.     DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.)) !GET NEW.
  390.     IF(DWEAP.NE.0) CALL RSPSUB(605,ODESC2(DWEAP))
  391. C BLOW, PAGE 6
  392. C
  393. 4000    BLOW=RES                !RETURN RESULT.
  394.     IF(.NOT.HFLG) GO TO 4500        !HERO?
  395.     OCAPAC(V)=DEF                !STORE NEW CAPACITY.
  396.     IF(DEF.NE.0) GO TO 4100            !DEAD?
  397.     OFLAG2(V)=OFLAG2(V).AND. .NOT.FITEBT    !YES, NOT FIGHTING.
  398.     CALL RSPSUB(572,DV)            !HE DIES.
  399.     CALL NEWSTA(V,0,0,0,0)            !MAKE HIM DISAPPEAR.
  400.     IF(RA.EQ.0) RETURN            !IF NX TO DO, EXIT.
  401.     PRSA=DEADXW                !LET HIM KNOW.
  402.     F=OAPPLI(RA,0)
  403.     RETURN
  404. C
  405. 4100    IF((RES.NE.ROUT).OR.(RA.EQ.0)) RETURN
  406.     PRSA=OUTXW                !LET HIM BE OUT.
  407.     F=OAPPLI(RA,0)
  408.     RETURN
  409. C
  410. 4500    ASTREN(H)=-10000            !ASSUME DEAD.
  411.     IF(DEF.NE.0) ASTREN(H)=DEF-OD
  412.     IF(DEF.GE.OD) GO TO 4600
  413.     CTICK(CEVCUR)=30
  414.     CFLAG(CEVCUR)=.TRUE.
  415. 4600    IF(FIGHTS(H,.TRUE.).GT.0) RETURN
  416.     ASTREN(H)=1-FIGHTS(H,.FALSE.)        !HE'S DEAD.
  417.     CALL JIGSUP(596)
  418.     BLOW=-1
  419.     RETURN
  420. C
  421.     END
  422. C SWORDD- SWORD INTERMOVE DEMON
  423. C
  424. C DECLARATIONS
  425. C
  426.     SUBROUTINE SWORDD
  427.     IMPLICIT INTEGER(A-Z)
  428.     LOGICAL INFEST,FINDXT
  429. C
  430. C GAME STATE
  431. C
  432.     LOGICAL TELFLG
  433.     COMMON /PLAY/ WINNER,HERE,TELFLG
  434. C
  435. C EXITS
  436. C
  437.     COMMON /CURXT/ XTYPE,XROOM1,XSTRNG,XACTIO,XOBJ
  438.     EQUIVALENCE (XFLAG,XOBJ)
  439. C
  440.     COMMON /XSRCH/ XMIN,XMAX,XDOWN,XUP,
  441.     1    XNORTH,XSOUTH,XENTER,XEXIT,XEAST,XWEST
  442. C
  443. C OBJECTS
  444. C
  445.     COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
  446.     1    OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
  447.     2    OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
  448.     3    OADV(220),OCAN(220),OREAD(220)
  449. C
  450.     COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
  451.     COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
  452.     COMMON /OINDEX/    LEAVE,TROLL,AXE
  453.     COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
  454.     COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
  455.     COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
  456.     COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
  457.     COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
  458.     COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
  459.     COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
  460.     COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
  461.     COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
  462.     COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
  463.     COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
  464.     COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
  465.     COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
  466.     COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
  467.     COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
  468.     COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
  469.     COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR
  470.     COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
  471.     COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
  472. C
  473. C VILLAINS AND DEMONS
  474. C
  475.     LOGICAL THFFLG,SWDACT,THFACT
  476.     COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT,SWDSTA
  477. C
  478. C ADVENTURERS
  479. C
  480.     COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
  481. C SWORDD, PAGE 2
  482. C
  483.     IF(OADV(SWORD).NE.PLAYER) GO TO 500    !HOLDING SWORD?
  484.     NG=2                    !ASSUME VILL CLOSE.
  485.     IF(INFEST(HERE)) GO TO 300        !VILL HERE?
  486.     NG=1
  487.     DO 200 I=XMIN,XMAX,XMIN            !NO, SEARCH ROOMS.
  488.       IF(.NOT.FINDXT(I,HERE)) GO TO 200    !ROOM THAT WAY?
  489.       GO TO (50,200,50,50),XTYPE        !SEE IF ROOM AT ALL.
  490. 50      IF(INFEST(XROOM1)) GO TO 300        !CHECK ROOM.
  491. 200    CONTINUE
  492.     NG=0                    !NO GLOW.
  493. C
  494. 300    IF(NG.EQ.SWDSTA) RETURN            !ANY STATE CHANGE?
  495.     CALL RSPEAK(NG+495)            !YES, TELL NEW STATE.
  496.     SWDSTA=NG
  497.     RETURN
  498. C
  499. 500    SWDACT=.FALSE.                !DROPPED SWORD,
  500.     RETURN                    !DISABLE DEMON.
  501.     END
  502. C INFEST-    SUBROUTINE TO TEST FOR INFESTED ROOM
  503. C
  504. C DECLARATIONS
  505. C
  506.     LOGICAL FUNCTION INFEST(R)
  507.     IMPLICIT INTEGER(A-Z)
  508. C
  509. C ROOMS
  510. C
  511.     COMMON /RINDEX/ WHOUS,LROOM,CELLA
  512.     COMMON /RINDEX/ MTROL,MAZE1    
  513.     COMMON /RINDEX/ MGRAT,MAZ15    
  514.     COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER
  515.     COMMON /RINDEX/ STREA,EGYPT,ECHOR
  516.     COMMON /RINDEX/ TSHAF    
  517.     COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC
  518.     COMMON /RINDEX/ CAROU    
  519.     COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT
  520.     COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL
  521.     COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR
  522.     COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4
  523.     COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER
  524.     COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR
  525.     COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX
  526.     COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE
  527.     COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR
  528.     COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR
  529.     COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL
  530.     COMMON /RINDEX/ CPANT,CPOUT,CPUZZ
  531. C
  532. C OBJECTS
  533. C
  534.     COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
  535.     1    OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
  536.     2    OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
  537.     3    OADV(220),OCAN(220),OREAD(220)
  538. C
  539.     COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
  540.     COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
  541.     COMMON /OINDEX/    LEAVE,TROLL,AXE
  542.     COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
  543.     COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
  544.     COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
  545.     COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
  546.     COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
  547.     COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
  548.     COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
  549.     COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
  550.     COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
  551.     COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
  552.     COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
  553.     COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
  554.     COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
  555.     COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
  556.     COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
  557.     COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
  558.     COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR
  559.     COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
  560.     COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
  561. C
  562. C VILLAINS AND DEMONS
  563. C
  564.     LOGICAL THFFLG,SWDACT,THFACT
  565.     COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT,SWDSTA
  566. C
  567. C FLAGS
  568. C
  569.     LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
  570.     LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
  571.     LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
  572.     LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
  573.     LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
  574.     LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
  575.     LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
  576.     LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF
  577.     COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
  578.     1    DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
  579.     2    MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
  580.     3    EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
  581.     4    GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
  582.     5    GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
  583.     6    MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
  584.     7    FOLLWF,SPELLF,CPOUTF,CPUSHF
  585.     COMMON /FINDEX/ BTIEF,BINFF
  586.     COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA
  587.     COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP
  588.     COMMON /FINDEX/ MDIR,MLOC,POLEUF
  589.     COMMON /FINDEX/ QUESNO,NQATT,CORRCT
  590.     COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE
  591. C
  592.     IF(.NOT.ENDGMF) INFEST=(OROOM(CYCLO).EQ.R).OR.
  593.     1    (OROOM(TROLL).EQ.R).OR.
  594.     2    ((OROOM(THIEF).EQ.R).AND.THFACT)
  595.     IF(ENDGMF) INFEST=(R.EQ.MRG).OR.(R.EQ.MRGE).OR.
  596.     1    (R.EQ.MRGW).OR.
  597.     2    ((R.EQ.INMIR).AND.(MLOC.EQ.MRG))
  598.     RETURN
  599.     END
  600.