'=========================================================================== ' Subject: COMBAT GAME Date: 03-06-96 (09:55) ' Author: Jacques Mallah Code: QB, QBasic, PDS ' Origin: pages.nyu.edu/~jqm1584/ Packet: GAMES.ABC '=========================================================================== DECLARE SUB PRNTM (MX!, MY!) : 'CB2.BAS by Jacques Mallah DECLARE SUB MAPMAK () : DECLARE FUNCTION D (N, T, P) : RANDOMIZE TIMER MXMN = 10: DIM MAP(1 TO 80, 1 TO 23): X = D(1, 80, 0): Y = D(1, 23, 0) X = 1: Y = 13: ' Kill 10 monsters to win DIM MLX(-1 TO 14), MLY(-1 TO 14): FOR TE = 1 TO 75 MAP(D(1, 80, 0), D(1, 23, 0)) = 11: NEXT FOR M = 1 TO 80: MAP(M, 10) = 13: MAP(M, 15) = 13: NEXT FOR M = 1 TO 10: MAP(26, M) = 13: NEXT FOR M = 15 TO 23: MAP(26, M) = 13: MAP(55, M) = 13: NEXT MAP(13, 10) = 11: MAP(14, 10) = 11: MAP(13, 15) = 11: MAP(14, 15) = 11 MAP(40, 10) = 11: MAP(41, 10) = 11: MAP(40, 15) = 11: MAP(41, 15) = 11 MAP(66, 10) = 11: MAP(67, 10) = 11: MAP(66, 15) = 11: MAP(67, 15) = 11 MAP(X, Y) = -1: FOR M = 1 TO MXMN MP: MX = D(1, 80, 0): MY = D(1, 23, 0): IF MAP(MX, MY) <> 0 THEN GOTO MP MAP(MX, MY) = M: MLX(M) = MX: MLY(M) = MY: NEXT HPT1 = 25: THAC01 = 13: AC1 = 1: ATT1 = 1: DDN1 = 1: DDT1 = 8: DDP1 = 1 ST1 = 7: HP1 = HPT1: ITEM$(1) = "(P)OTION OF EXTRA HEALING": ITN(1) = 2 ITEM$(2) = "(G)RENADE": ITN(2) = 1 ITEM$(3) = "(S)TRENGTH POTION": ITN(3) = 1 ITEM$(4) = "(C)ALTROP DETECTION POTION": ITN(4) = 1 ITEM$(5) = "(A)DDED TOTAL HP POTION": ITN(5) = 0: IT1 = 5 1 : MAPMAK: CLS : RN = 0: IF MN = 12 GOTO 24 RESTORE: FOR M = 1 TO MN READ N2$, HD2, HDP2, THAC02, AC2, ATT2, DDN2, DDT2, DDP2, ST2, SP$, TR: NEXT IF OHPT2(MN) = 0 THEN HPT2 = D(HD2, 8, HDP2): HP2 = HPT2: OHPT2(MN) = HP2 ELSE HP2 = HP2(MN): HPT2 = OHPT2(MN) 10 RN = RN + 1: PRINT : PRINT "Round "; RN: PRINT "1:FIGHTER", "HP1="; HP1; "/"; HPT1 PRINT "2:"; N2$: ', "HP2="; HP2; "/"; HPT2 11 PRINT "#1 ACTION:(R)UN,(I)TEM,(SPACE OR ENTER)=FIGHT" 12 I$ = UCASE$(INPUT$(1)) IF I$ <> " " AND I$ <> "R" AND I$ <> "I" AND I$ <> CHR$(13) THEN 12 IF I$ = "I" THEN GOSUB ITEM: IF IT$ = "" THEN 11 I1 = D(1, 6, 0): I2 = D(1, 6, 0): I = 0 IF I1 > I2 THEN I = 1: PRINT "1 HAS INIT.": GOSUB A1: IF I$ = "R" GOTO 23 IF I1 > I2 AND HP2 > .1 THEN GOSUB A2 IF HP1 < 1 GOTO 21 IF HP2 < 1 GOTO 22 IF I2 > I1 THEN I = 2: PRINT "2 HAS INIT.": GOSUB A2: IF HP1 > .1 THEN GOSUB A1: IF I$ = "R" GOTO 23 IF HP1 < 1 GOTO 21 IF HP2 < 1 GOTO 22 IF I = 0 THEN PRINT "SIMULTANEOUS INIT.": GOSUB A1: IF I$ = "R" GOTO 23 IF I = 0 THEN GOSUB A2 IF HP1 < 1 AND HP2 < 1 GOTO 20 IF HP1 < 1 GOTO 21 IF HP2 < 1 GOTO 22 GOTO 10 20 PRINT "BOTH 1 AND 2 ARE DEAD": PRINT : PRINT "SCORE:"; S: PRINT : END 21 PRINT "HP2="; HP2; "/"; HPT2, , "1 IS DEAD": PRINT : PRINT "SCORE:"; S: PRINT : END 22 PRINT "HP1="; HP1; "/"; HPT1, , "2 IS DEAD": SPB = 0: MNK = MNK + 1: S = S + 20 + 10 * HD2 23 IF TR > 0 AND I$ <> "R" THEN PRINT "U FIND A "; ITEM$(TR): ITN(TR) = ITN(TR) + 1 IF MNK = MXMN THEN PRINT : PRINT "U WIN": PRINT "SCORE:"; S + HP1 * 2 + 30: PRINT : END 25 PRINT "#1 ACTION:(I)TEM,OTHER=CONTINUE": I$ = UCASE$(INPUT$(1)) IF I$ <> "I" THEN 1 24 GOSUB ITEM: IF IT$ = "" THEN 1 IF IT$ = "P" THEN PRINT "1 USES "; ITEM$(1): HP1 = HP1 + D(3, 8, 3): S = S - 20: IF HP1 > HPT1 THEN HP1 = HPT1 IF IT$ = "G" THEN PRINT "1 WASTES "; ITEM$(2): S = S - 50 IF IT$ = "S" THEN PRINT "1 WASTES "; ITEM$(3): S = S - 50 IF IT$ = "C" THEN PRINT "1 USES "; ITEM$(4): CLDT = 1: CLT = TIMER: S = S - 20 IF IT$ = "A" THEN PRINT "1 USES "; ITEM$(5): HPT1 = HPT1 + D(1, 6, 0) PRINT "HP1="; HP1; "/"; HPT1: PRINT : GOTO 25 A1: IF I$ = "R" THEN PRINT "#1 HAS FLOWN LIKE A CHICKEN.": X = OX: Y = OY: HP2(MN) = HP2: GOTO 31 IF I$ = "I" GOTO 31 H = D(1, 20, AC2): IF H - AC2 = 20 THEN H = H + 5 IF H - AC2 = 1 THEN H = 0 IF H >= THAC01 THEN DAM = D(DDN1, DDT1, DDP1 + SPB): IF SP$ = "1/2" THEN DAM = CINT(DAM / 2) HP2 = HP2 - DAM: PRINT "1'S ATT HIT" END IF 31 IF I$ = "I" THEN IF IT$ = "P" THEN PRINT "1 USES "; ITEM$(1): S = S - 20: HP1 = HP1 + D(3, 8, 3): IF HP1 > HPT1 THEN HP1 = HPT1 IF IT$ = "G" THEN PRINT "1 USES "; ITEM$(2): HP2 = HP2 - D(3, 6, 0): S = S - 20 IF IT$ = "S" THEN PRINT "1 USES "; ITEM$(3): SPB = 6: S = S - 20 IF IT$ = "C" THEN PRINT "1 WASTES "; ITEM$(4): S = S - 50 IF IT$ = "A" THEN PRINT "1 USES "; ITEM$(5): HPT1 = HPT1 + D(1, 6, 0) END IF RETURN A2: H = D(1, 20, AC1): IF H - AC1 = 20 THEN H = H + 5 IF H - AC1 = 1 THEN H = 0 IF H >= THAC02 THEN HP1 = HP1 - D(DDN2, DDT2, DDP2): PRINT "2'S ATT HIT" IF SP$ = "POI" AND D(1, 20, 0) < ST1 THEN PRINT "1 IS POISONED!": HP1 = -10 IF SP$ = "REG" THEN HP2 = HP2 + 3: IF HP2 > HPT2 THEN HP2 = HPT2 END IF RETURN 'N2$, HD2, HDP2, THAC02,AC2, ATT2, DDN2, DDT2, DDP2, ST2, SP$,TR DATA OGRE,4,1,12,3,1,1,10,0,11,,1 DATA HOBGOBLIN,1,1,14,5,1,1,8,0,11,,3 DATA SKELETON,1,0,15,5,1,1,8,0,11,1/2,2 DATA HUGE SPIDER,2,2,14,5,1,1,6,0,11,POI,3 DATA SKELETON,1,0,15,5,1,1,8,0,11,1/2,5 DATA RAT,0,1,16,7,1,0,0,1,11,,4 DATA HUGE SPIDER,2,2,14,5,1,1,6,0,11,POI,2 DATA RAT,0,1,16,7,1,0,0,1,11,,2 DATA RAT,0,1,16,7,1,0,0,1,11,,1 DATA TROLL,6,3,11,4,1,2,8,0,11,REG,2 ITEM: PRINT "1 HAS THESE ITEMS:" FOR II = 1 TO IT1: IF ITN(II) > 0 THEN PRINT ITEM$(II); " x"; ITN(II) NEXT: PRINT "OTHER:DON'T USE ITEM": IT$ = UCASE$(INPUT$(1)) IF IT$ = "P" THEN IF ITN(1) > 0 THEN ITN(1) = ITN(1) - 1 ELSE IT$ = "" IF IT$ = "G" THEN IF ITN(2) > 0 THEN ITN(2) = ITN(2) - 1 ELSE IT$ = "" IF IT$ = "S" THEN IF ITN(3) > 0 THEN ITN(3) = ITN(3) - 1 ELSE IT$ = "" IF IT$ = "C" THEN IF ITN(4) > 0 THEN ITN(4) = ITN(4) - 1 ELSE IT$ = "" IF IT$ = "A" THEN IF ITN(5) > 0 THEN ITN(5) = ITN(5) - 1 ELSE IT$ = "" IF IT$ <> "P" AND IT$ <> "S" AND IT$ <> "G" AND IT$ <> "C" AND IT$ <> "A" THEN IT$ = "" RETURN FUNCTION D (N, T, P) FOR C = 1 TO N: S = S + INT(RND * T + 1): NEXT D = S + P END FUNCTION SUB MAPMAK SHARED MAP(), X, Y, MN, OX, OY, HP1, HPT1, CLDT, CLT, S, MLX(), MLY(), MXMN SM: CLS : MN = 0: MAP(X, Y) = -1: FOR MX = 1 TO 80: FOR MY = 1 TO 23: IF MAP(MX, MY) = 0 GOTO STM IF CLDT = 1 AND MAP(MX, MY) = 11 THEN LOCATE MY, MX: PRINT "."; : GOTO STM IF MAP(MX, MY) = 13 THEN LOCATE MY, MX: PRINT "["; : GOTO STM IF MAP(MX, MY) > 0 AND MAP(MX, MY) < 11 THEN PRNTM MX, MY: GOTO STM IF MAP(MX, MY) < 0 THEN LOCATE MY, MX: PRINT "U"; STM: NEXT: NEXT: MC = 1 LP: I$ = UCASE$(RIGHT$(INKEY$, 1)) IF CLDT = 1 AND TIMER - 50 > CLT THEN CLDT = 0: GOTO SM LOCATE 24, 1: PRINT "HP1 / HPT1 ="; HP1; "/"; HPT1; , "(I)TEM; MOVE:CRSR"; LOCATE 24, 60: PRINT "SCORE:"; S; : TIM = TIMER IF TIM <> OTIM AND I$ = "" THEN XS = MLX(MC): YS = MLY(MC): MC = MC + 1: IF MC > MXMN THEN MC = 1 XS2 = XS: YS2 = YS: IF X > XS THEN XS2 = XS + 1 IF Y > YS THEN YS2 = YS + 1 IF X < XS THEN XS2 = XS - 1 IF Y < YS THEN YS2 = YS - 1 IF MAP(XS2, YS2) < 11 THEN LOCATE YS, XS: PRINT " "; : LOCATE YS2, XS2: PRINT " "; MLX(MAP(XS, YS)) = XS2: MLY(MAP(XS, YS)) = YS2 MAP(X, Y) = 0: MM = MAP(XS2, YS2): MAP(XS2, YS2) = MAP(XS, YS): MAP(XS, YS) = MM IF MAP(X, Y) = 0 THEN MAP(X, Y) = -1 IF MAP(XS, YS) > 0 THEN PRNTM XS, YS: OX1 = XS: OY1 = YS IF MAP(XS2, YS2) > 0 THEN PRNTM XS2, YS2: OX1 = XS: OY1 = YS IF MAP(XS, YS) = -1 THEN LOCATE YS, XS: PRINT "U"; IF MAP(XS2, YS2) = -1 THEN LOCATE YS2, XS2: PRINT "U"; IF MAP(X, Y) > 0 THEN I$ = " ": OOO = 1 END IF END IF OTIM = TIM: IF I$ = "" THEN GOTO LP LOCATE Y, X: PRINT " "; : OX = X: OY = Y IF I$ = "H" AND Y > 1 THEN MAP(X, Y) = 0: Y = Y - 1 IF I$ = "P" AND Y < 23 THEN MAP(X, Y) = 0: Y = Y + 1 IF I$ = "K" AND X > 1 THEN MAP(X, Y) = 0: X = X - 1 IF I$ = "M" AND X < 80 THEN MAP(X, Y) = 0: X = X + 1 IF I$ = "I" THEN MN = 12 IF MAP(X, Y) <= 0 THEN MAP(X, Y) = -1: LOCATE Y, X: PRINT "U"; IF MN = 11 THEN LOCATE 25, 1: PRINT " "; : MN = 0 IF MN < 12 THEN IF MAP(X, Y) > 0 THEN MN = MAP(X, Y) ELSE GOTO LP IF MN = 11 THEN LOCATE 25, 1: PRINT "U STEPPED ON TETSU-BISHI."; : HP1 = HP1 - 1: MAP(X, Y) = -1: LOCATE Y, X: PRINT "U"; : IF HP1 > .1 THEN GOTO LP ELSE LOCATE 25, 40: PRINT "1 IS DEAD!"; : END IF MN = 13 THEN X = OX: Y = OY: MN = 0: LOCATE Y, X: PRINT "U"; : GOTO LP IF OOO = 1 THEN OOO = 0: OX = OX1: OY = OY1 END SUB SUB PRNTM (MX, MY) SHARED X, Y IF (X - MX) ^ 2 + (Y - MY) ^ 2 < 26 THEN LOCATE MY, MX: PRINT "M" END SUB