'===========================================================================
' Subject: JACK'S GAME                        Date: 03-06-96 (09:55)       
'  Author: Jacques Mallah                     Code: QB, QBasic, PDS        
'  Origin: pages.nyu.edu/~jqm1584/          Packet: GAMES.ABC
'===========================================================================
'JGS.BAS by Jacques Mallah
H = 5: RANDOMIZE TIMER: SCREEN 7: L = TIMER
J: M = M + 1: IF TIMER - L < .4 THEN GOTO J
M = M / 500: X = 2: Y = 10: BX = 38: BY = 10: FC = 16: OXP = -10: OYP = -10
MM = M: ZX = 38: ZY = 2: DIM UA(0 TO 7, 0 TO 7): XP = X * 8 - 4: YP = 76: DIM BA(0 TO 7, 0 TO 7)
DIM A(0 TO 7, 0 TO 7): GOSUB 10: GOSUB 10: BH = 1: LOCATE 1, 1: PRINT "H=  5.00", "S="; S, "BH="; BH: LOCATE 3, 10: PRINT "J A C K 'S  G A M E"
PRINT "KILL THE BAD GUY,   NOW."; : PUT (18 * 8, 24), BA
PRINT "TO SURVIVE MORE SHOTS, PICK UP:": PRINT "H FOR 1 H, "; : COLOR 9: PRINT "H"; : COLOR 15: PRINT " FOR 3 H POINTS."
PRINT "USE CURSOR TO MOVE AND ALMOST ANY OTHER KEY TO SHOOT WHEN "; : COLOR 14: PRINT "-"; : COLOR 15: PRINT " IS WHITE."
LOCATE 12, 1: PRINT "H= # OF HITS YOU CAN TAKE.": PRINT "S= YOUR SCORE": PUT (BX * 8 - 8, BY * 8 - 8), BA: PUT (XP - 4, YP - 4), UA:
LINE (XP + 5, YP)-(XP + 10, YP), 14
PRINT "BH= # OF HITS BAD GUY CAN TAKE.": PRINT "BAD GUYS WOUND YOU AT CLOSE RANGE.": PRINT "H AND "; : COLOR 9: PRINT "H"; : COLOR 15:
PRINT " DON'T MOVE RANDOMLY.": PRINT "YOU CAN TURN AROUND BOUNCING OFF WALLS": PRINT : PRINT "PAUSE PAUSES IT."
PRINT "ON SOME MACHINES, DON'T PRESS KEYS": PRINT "TOO OFTEN, TO AVOID BACKUP.": PRINT "PRESS ONLY ONE KEY AT A TIME."
PRINT "PRESS S FOR SOUND."
TX = 33: TY = 12: LOCATE TY, TX: PRINT "H"; : LOCATE ZY, ZX: COLOR 9: PRINT "H";
COLOR 15: LOCATE 25, 1: PRINT "PRESS ANY KEY (NOT S) TO START"; : Q = 1: OTY = TY: OTX = TX: OZX = ZX: OZY = ZY
DC = .8 ^ (1 / M): Z = 11 * M ^ 2: NB = M * .14: PS = 1.5 / M: INJ = 1
SS = 3.3 / M: VX = .1 / M: RV = -VX: RR = 1.0013 ^ (1 / M)
IK: I$ = INKEY$: IF I$ = "" THEN GOTO IK
IF UCASE$(I$) <> "S" THEN LINE (XP - 5, YP)-(XP - 10, YP), 0: LINE (0, 176)-(319, 199), 0, BF: GOTO 1
IF SSS = 0 THEN SSS = 1: LOCATE 23, 1: PRINT "PRESS S FOR NO SOUND.": GOTO IK
IF SSS = 1 THEN SSS = 0: LOCATE 23, 1: PRINT "PRESS S FOR SOUND.   ": GOTO IK
G: TX = INT(2 + RND * 36): TY = INT(2 + RND * 21): VTY = 0
1 C = C + PS * .61
IF ZB < TIMER THEN
LINE (OBX * 8 - 8, OBY * 8 - 8)-(OBX * 8, OBY * 8), 0, BF
IF Q = 1 THEN
IF INJ = 1 THEN PUT (BX * 8 - 8, BY * 8 - 8), BA
ELSE Q = 1: CLS : PUT (0, 0), BA: GOSUB Q: GOSUB P: ZB = ZB + 4
END IF
END IF
LOCATE OTY, OTX: PRINT " "; : LOCATE OZY, OZX: PRINT " "; : OTY = TY: OTX = TX: OZY = ZY: OZX = ZX
LOCATE 1, 1: PRINT USING "H= ##.##&"; H: LOCATE 1, 15: PRINT "S="; S, "BH="; BH
LOCATE TY, TX: PRINT "H";
LOCATE ZY, ZX: COLOR 9: PRINT "H"; : COLOR 15
IF RV > 2.5 / M THEN VX = VX * 2.5 / RV / M: VY = VY * 2.5 / RV / M: RV = 2.5 / M
I$ = RIGHT$(INKEY$, 1)
ON (BZ + Q) GOSUB 200, 200, 200, 210, 220, 230, 240, 250, 250, 250
IF I$ = "H" THEN VY = VY - .08 / NB: GOTO 2
IF I$ = "P" THEN VY = VY + .08 / NB: GOTO 2
IF I$ = "K" THEN VX = VX - .1 / NB: GOTO 2
IF I$ = "M" THEN VX = VX + .1 / NB: GOTO 2
IF I$ = "" THEN 2
IF FC < 33 THEN
I$ = INKEY$
ELSE
SOUND 450, 1 * SSS
LINE (SX + VSX, SY + VSY)-(SX - VSX, SY - VSY), 0: BS = 0
FC = 0: VSX = VX / RV * 4: VSY = VY / RV * 4: SF = 1: SX = XP: SY = YP
END IF
2 R = ((X - BX) ^ 2 + ((Y - BY) * 1.25) ^ 2) ^ .5 + .01
LINE (XP - 4, YP - 4)-(XP + 4, YP + 4), 0, BF
LINE (XP + XPV * 5, YP + YPV * 5)-(XP + VXP * 10, YP + VYP * 10), 0, BF
X = X + VX: IF X < 2 OR X > 38 THEN X = X - VX: VX = -VX * .4: GOSUB DEP: IF VY ^ 2 > .0000001 THEN VY = VY * .3
Y = Y + VY: IF Y < 2 OR Y > 23 THEN Y = Y - VY: VY = -VY * .4: GOSUB DEP: IF VX ^ 2 > .0000001 THEN VX = VX * .3
JX = 10000: IF (VX * 10) ^ 2 * M > .0000001 * JY THEN VX = VX * DC: JX = 1
JY = 10000: IF (VY * 10) ^ 2 * M > .0000001 * JX THEN VY = VY * DC: JY = 1
XP = X * 8 - 4: YP = Y * 8 - 4: PUT (XP - 4, YP - 4), UA
RV = ((VX) ^ 2 + (1.25 * VY) ^ 2) ^ .5: FC = FC + SS * .9: IF RV > .4 / M THEN DC = .8 ^ (1 / M) ELSE DC = .6 ^ (1 / M)
VXP = VX / RV: VYP = VY / RV: LINE (XP + VXP * 5, YP + VYP * 5)-(XP + VXP * 10, YP + VYP * 10), 14 - (FC > 32)
IF SF = 1 THEN
LINE (SX + VSX, SY + VSY)-(SX - VSX, SY - VSY), 0
DD = (BX * 8 - 4 - SX) * VSX / 4 + (BY * 8 - 4 - SY) * VSY * 1.25 ^ 2 / 4
DE = (BX * 8 - 4 - SX) ^ 2 + ((BY * 8 - 4 - SY) * 1.25) ^ 2 - (DD ^ 2)
IF DD > -6 AND DD < 8 + 3 * 4 * SS AND DE < 75 THEN
IF Q = 1 AND TIMER > ZB AND BS = 0 THEN BH = BH - 1: S = S + 2 * BZ + 2: SF = 0: CLS : GOSUB TBASE: BS = 1
IF BH <= 0 THEN
BZ = BZ + 1: Q = 0: LINE (BX * 8 - 8, BY * 8 - 8)-(BX * 8, BY * 8), 0, BF: BH = BZ: GOSUB 10: ZB = TIMER + 5: PS = (1.5 + .08 * BH) / M:
VBX = VBX + (RND * 2 - 1) / M: VBY = VBY * (RND * 1.6 - .8) / M
IF BZ = 5 THEN INJ = 1
IF BZ > 4 THEN PS = 2 / M
IF BZ < 8 THEN BX = 38: BY = 2 + RND * 21: VBX = (RND - .5) / M: VBY = (RND - .5) / M ELSE EEP = 1
END IF
END IF
SX = SX + VSX * SS * 3: SY = SY + VSY * SS * 3
IF SF = 1 THEN LINE (SX + VSX, SY + VSY)-(SX - VSX, SY - VSY), 13
END IF
VTY = VTY + .02 / M ^ 2: TY = TY + VTY: IF TY > 23 OR TY < 2 THEN VTY = -VTY: TY = TY + VTY
IF (X - TX) ^ 2 + ((Y - TY) * 1.25) ^ 2 < 1.1 THEN S = S + CINT(BZ / 2) + 1: H = H + 1: GOTO G
VZX = VZX * .99 ^ (1 / M) + (TX - ZX) / 72 / M ^ 2: ZX = ZX + VZX
VZY = VZY * .99 ^ (1 / M) + (TY - ZY) / 90 / M ^ 2: ZY = ZY + VZY
IF ZX + VZX > 38 OR ZX + VZX < 2 THEN VZX = -VZX
IF ZY + VZY > 23 OR ZY + VZY < 2 THEN VZY = -VZY
IF INT(X + .5) = CINT(ZX) AND INT(Y + .5) = INT(ZY + .5) THEN S = S + CINT(BZ / 2) + 1: H = H + 3: ZX = 38: ZY = 2: VZY = 0: VZX = -RND * 3 / M
IF Q = 0 OR TIMER < ZB THEN GOTO B
VBX = VBX * .9 ^ (1 / M) + (X - BX) / R / Z + (RND - .5) / Z * 1.9
VBY = VBY * .9 ^ (1 / M) + (Y - BY) / Z / 1.25 / R + (RND - .5) / Z * 1.52
IF BX + VBX > 38 OR BX + VBX < 2 THEN VBX = -VBX
IF BY + VBY > 24 OR BY + VBY < 2 THEN VBY = -VBY
OBX = BX: OBY = BY: BX = BX + VBX: BY = BY + VBY
IF INT(X + .5) = INT(.5 + BX) AND INT(Y + .5) = INT(BY + .5) THEN H = H - .4 / M: LINE (0, 0)-(319, 199), 4, BF: CLS
B: IF C <= 14 THEN GOTO SM
IF Q = 1 AND TIMER > ZB THEN
SOUND 750, 1 * SSS
EEP = 0: LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 0
FX = BX: FY = BY: RVF = (((X - BX) + VX * R / PS / 3) ^ 2 + (((Y - BY) + VY * R / PS / 3) * 1.25) ^ 2) ^ .5
VFX = ((X - BX) + VX * R / PS / 3) / 2 / RVF: VFY = ((Y - BY) + VY * R / PS / 3) / 2 / RVF: C = 0: F = 0
ELSE
F = 1
END IF
SM: DD = (X - FX) * VFX * 2 + (Y - FY) * VFY * 1.25 ^ 2 * 2
DE = (X - FX) ^ 2 + (Y - FY) ^ 2 * 1.25 ^ 2 - (DD ^ 2)
LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 0
IF DD > -.5 AND DD < .5 + 3 * .5 * PS AND DE < .8 AND F = 0 THEN H = H - 1: F = 1: TFK = TIMER + 1: LINE (0, 0)-(319, 199), 4, BF: GOSUB TBASE: CLS : IF ZB > TIMER THEN LOCATE 3, 1: PRINT "BAD GUY:": PRINT F$
FX = FX + VFX * PS * 3: FY = FY + VFY * PS * 3
IF F = 0 THEN LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 4
S = S * RR: IF H > 0 THEN 1
CLS
3 GOSUB DEP: S = INT(S): COLOR 15: GOTO 50
7 CLS : PP = 0: IF BH < 9 THEN PRINT "ENTER S TO SEE HIGH SCORES"
PRINT "S ="; S: PP = 0: INPUT "ANOTHER GAME(Y/DEFAULT = NO)"; Y$
IF Y$ = "Y" OR Y$ = "y" THEN CLS : RUN
IF (Y$ = "S" OR Y$ = "s") AND BH < 9 THEN 51
END
DEP:  I$ = INKEY$: IF I$ <> "" THEN GOTO DEP
SOUND 600, 1 * SSS: RETURN
TBASE: FOR T = 1 TO 90 * (M - 1): NEXT: SOUND 300, 1 * SSS: RETURN
Q: IF BZ > 7 THEN RETURN
FOR C = 0 TO 7: FOR T = 0 TO 7: A(C, T) = POINT(C, T): NEXT: NEXT
FOR N = 1 TO 6 STEP 1 / MM
FOR C = 0 TO 7: I$ = INKEY$: FOR T = 0 TO 7
LINE (C * N, T * N)-(C * N + N - 1, T * N + N - 1), A(C, T), BF
NEXT: NEXT: NEXT: GOSUB DEP: CLS : RETURN
P: IF BZ < 9 AND Q = 0 THEN READ F$
IF BZ = 0 THEN LOCATE 9, 1: PRINT F$
IF BZ < 9 AND BZ <> 0 THEN LOCATE 3, 1: PRINT "BAD GUY:": PRINT F$
IF BZ = 9 THEN LOCATE 4, 1: PRINT "IF YOU DISPEL ITS FORM A THIRD TIME": PRINT "IT WILL BE BANISHED"
RETURN
10 IF BZ > 1 THEN BH = BH - 1: IF BH > 6 THEN BH = 6
IF BZ = 2 THEN RETURN
IF BZ = 10 THEN 15
IF BZ < 8 THEN READ F1, F2, F3, F4: LOCATE 1, 1: PRINT " "
LINE (3, 0)-(4, 1), F1, B: LINE (7, 5)-(7, 5), F1: LINE (0, 5)-(0, 5), F1
LINE (1, 2)-(6, 2), F2: LINE (3, 3)-(4, 4), F2, B: LINE (0, 3)-(0, 4), F2
LINE (7, 3)-(7, 4), F2: LINE (3, 5)-(2, 6), F3: LINE (4, 5)-(5, 6), F3
LINE (0, 7)-(1, 7), F4: LINE (6, 7)-(7, 7), F4
IF AU = 0 THEN GET (0, 0)-(7, 7), UA: AU = 1: GOSUB Q: GOSUB P: RETURN
GET (0, 0)-(7, 7), BA: IF BZ = 0 THEN GOSUB Q
GOSUB P: RETURN
DATA 6,9,1,8,,6,8,8,8,"THE BAD GUY NOW IS A SECURITY GUARD",6,2,2,2,"ARMY GUY",6,6,15,6,"KARATE MASTER - STUN SHOTS"
DATA 6,0,0,0,"NINJA - INVISIBILITY",8,8,8,8,"ROBOT - HEAT SEEKING SHOTS",8,2,2,2,"ARMY ROBOT - EXPLOSIVE SHOTS",4,4,4,4,"DEMON - CAN TELEPORT"
DATA "CAN IT BE DEAD?"
15 S = S * 1.5: PAINT (100, 100), 5, 12: COLOR 0
FOR T = 0 TO 6000 * M STEP 9: A = T * ATN(1) / 180 * 4: R = T / 30
IF T > 33000 THEN FOR JH = 1 TO M * 10000: NEXT: EXIT FOR
LINE (150 - R * COS(A), 95 - SIN(A) * R * .8)-(150 + R * .25, 95 - R * .25)
NEXT: DIM LX(-1 TO 1, -1 TO 1): DIM LY(-1 TO 1, -1 TO 1): X = 20: Y = 27
DIM VLX(-1 TO 1, -1 TO 1): DIM VLY(-1 TO 1, -1 TO 1): SCREEN 0
FOR C = 9 TO 15: COLOR C
EX = 0: VS = -.83 - RND / 7: X = 17 + 6 * RND
FOR T = -1 TO 1: FOR A = -1 TO 1: VLY(T, A) = VS: VLX(T, A) = 0
LX(T, A) = X: LY(T, A) = Y: NEXT: NEXT
20 FOR T = -1 TO 1: FOR A = -1 TO 1
IF LX(T, A) > .5 AND LX(T, A) < 40 AND LY(T, A) > .5 AND LY(T, A) < 25 THEN
FOR R = 0 TO M: LOCATE LY(T, A), LX(T, A): PRINT "`"; : NEXT
END IF
VLY(T, A) = VLY(T, A) + .02: LY(T, A) = LY(T, A) + VLY(T, A): LX(T, A) = LX(T, A) + VLX(T, A)
IF LX(T, A) > .5 AND LX(T, A) < 40 AND LY(T, A) > .5 AND LY(T, A) < 25 THEN
FOR R = 0 TO M: LOCATE LY(T, A), LX(T, A): PRINT "*"; : NEXT
END IF
NEXT: NEXT
IF VLY(0, 0) > 0 AND EX = 0 THEN
EX = 1: FOR T = -1 TO 1: FOR A = -1 TO 1
R = 1.5 / (3 + 3 * RND): VLX(T, A) = T * R: VLY(T, A) = VLY(T, A) + A * R: NEXT: NEXT
END IF
IF LY(-1, -1) < 26 OR EX = 0 OR LY(1, -1) < 26 THEN GOTO 20
LOCATE 1, 1: COLOR 0: PRINT " ": LOCATE 1, 1: SLEEP 1: CLS
NEXT
LOCATE 1, 1: PRINT "YOU WON": PRINT : GOTO 3
50 DIM N$(1 TO 10): DIM S$(1 TO 10): DIM S(1 TO 10)
SCREEN 8: ON ERROR GOTO 100
51 OPEN "SDF.12" FOR INPUT ACCESS READ AS #1
FOR T = 1 TO 10: LINE INPUT #1, N$(T): LINE INPUT #1, S$(T)
S(T) = VAL(S$(T)): NEXT: CLOSE #1
IF S <= S(10) AND Y$ <> "S" AND Y$ <> "s" THEN GOTO CL
IF UCASE$(Y$) = "S" THEN 52
PP = 0: FOR T = 10 TO 1 STEP -1: IF S > S(T) THEN PP = T
NEXT
52 CLS : PRINT "#", "NAME", , , "SCORE": PUT (88, 0), UA
FOR T = 10 TO 2 STEP -1: IF PP < T AND UCASE$(Y$) <> "S" THEN N$(T) = N$(T - 1): S(T) = S(T - 1): S$(T) = STR$(S(T))
NEXT: FOR T = 1 TO 10: LOCATE T + 1, 1: PRINT T, : IF T <> PP THEN PRINT N$(T) ELSE PRINT "   {You}"
LOCATE T + 1, 56: IF T <> PP THEN PRINT S$(T) ELSE PRINT S
NEXT: IF UCASE$(Y$) = "S" THEN GOTO 101
KILL "SDF.12"
100  IF ERR > 0 THEN PP = 1: CLOSE #1
IF S < 1 THEN BH = 10: GOTO CL
IF PP < 1 THEN GOTO CL
PRINT : PRINT "S ="; S: GOSUB DEP
INPUT "NAME? ", N$(PP): IF LEN(N$(PP)) > 40 THEN N$(PP) = LEFT$(N$(PP), 40)
S(PP) = S: S$(PP) = STR$(S)
OPEN "SDF.12" FOR OUTPUT ACCESS WRITE AS #1
FOR T = 1 TO 10: PRINT #1, N$(T): PRINT #1, S$(T): NEXT
GOSUB DEP: FOR T = 1 TO 15000 * M: NEXT
CL: CLOSE #1
101 IF Y$ = "S" OR Y$ = "s" THEN
PRINT : INPUT "ELIMINATE CURRENT LIST (YES/DEFAULT = NO)?", Y$
IF UCASE$(Y$) = "YES" THEN KILL "SDF.12": BH = 10: OPEN "SDF.12" FOR OUTPUT ACCESS WRITE AS #1: FOR T = 10 TO 100 * RND + 20: PRINT #1, "@"; : NEXT: CLOSE #1
END IF
GOTO 7
200 RETURN
210 IF TFK > TIMER THEN KM = 1 ELSE KM = 0
LINE (OXP - 8, OYP + 8)-(OXP + 7, OYP + 8), 0
IF KM = 1 THEN I$ = INKEY$: I$ = "": KM = 0: LINE (XP - 8, YP + 8)-(XP + 7, YP + 8), 7: OXP = XP: OYP = YP
RETURN
220 IF BZ = 5 THEN RETURN
IF Q = 0 OR ZB > TIMER THEN INJ = -1: RETURN
IF TB < TIMER THEN TB = TIMER + 3 + INJ / 2: INJ = -INJ
RETURN
230  IF F = 1 OR C > 14 THEN RETURN
DD = (X - FX) * VFX * 2 + (Y - FY) * VFY * 1.25 ^ 2 * 2 + .001
RUF = ((X - FX) ^ 2 + (Y - FY) ^ 2 * 1.25 ^ 2) ^ .5 + .001
RF = 42 * (DD) ^ 2 ^ .5 / RUF * M
LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 0
VFX = VFX + (X - FX) / RF: VFY = VFY + (Y - FY) / RF / 1.25
RF = (VFX ^ 2 + (VFY ^ 2 * 1.25 ^ 2)) ^ .5: VFX = VFX * .5 / RF: VFY = VFY * .5 / RF
C = C - PS * .2
LINE ((FX + VFX) * 8 - 4, (FY + VFY) * 8 - 4)-((FX - VFX) * 8 - 4, (FY - VFY) * 8 - 4), 4
RETURN
240 IF F = 1 OR EEP = 1 OR C > 14 THEN RETURN
IF FX < 1 THEN EX = 0: EY = FY * 8 - 1: EEP = 1
IF FX > 40 THEN EX = 319: EY = FY * 8 - 1: EEP = 1
IF FY < 1 THEN EY = 0: EX = FX * 8 - 1: EEP = 1
IF FY > 25 THEN EY = 199: EX = FX * 8 - 1: EEP = 1
IF EEP = 0 THEN RETURN
IF EX < 0 THEN EX = 0
IF EX > 319 THEN EX = 319
IF EY < 0 THEN EY = 0
IF EY > 199 THEN EY = 199
CIRCLE (EX, EY), 69, 4: PAINT (EX, EY), 4, 4: GOSUB TBASE: PAINT (EX, EY), 0, 0: CIRCLE (EX, EY), 69, 0
IF (X * 8 - 4 - EX) ^ 2 + (Y * 8 - 4 - EY) ^ 2 * 1.25 ^ 2 < 70 ^ 2 THEN H = H - 1
RETURN
250 IF EEP = 1 THEN RETURN
EEP = 1: PLZ = PLZ + 1: IF PLZ < 6 THEN RETURN
PLZ = 0: LINE (BX * 8 - 8, BY * 8 - 8)-(BX * 8, BY * 8), 0, BF
BX = 2 + RND * 36: BY = 2 + RND * 21: RETURN

