'$DYNAMIC 'Current Library-diskvoic.qlb DEFINT A-Z DECLARE SUB setmouse (mouse()) DECLARE SUB readmouse (mouse()) DECLARE SUB copypage (BYVAL page1, BYVAL page2) DECLARE SUB SETMODEX () DECLARE SUB setvispage (BYVAL page) DECLARE SUB drawsprite (pic(), pal(), BYVAL pal, BYVAL x, BYVAL y, BYVAL page) DECLARE SUB wardsprite (pic(), pal(), BYVAL pal, BYVAL x, BYVAL y, BYVAL page) DECLARE SUB stosprite (pic(), BYVAL x, BYVAL y, BYVAL page) DECLARE SUB loadsprite (pic(), BYVAL x, BYVAL y, BYVAL w, BYVAL h, BYVAL page) DECLARE SUB setpal (pal()) DECLARE SUB fadetopal (pal(), fbuf()) DECLARE SUB fadeto (fbuf(), BYVAL red, BYVAL blue, BYVAL green) DECLARE SUB setdiskpages (buf(), BYVAL s, BYVAL l) DECLARE SUB loadpage (fil$, BYVAL n, BYVAL p) DECLARE SUB setitup (fil$, buff(), tmp(), BYVAL p) DECLARE SUB resetdsp DECLARE SUB playsnd (BYVAL n, BYVAL f) DECLARE SUB closefile DECLARE SUB setkeys () DECLARE SUB setfont (f()) DECLARE SUB printstr (s$, BYVAL x, BYVAL y, BYVAL p) DECLARE SUB textcolor (BYVAL f, BYVAL b) DECLARE SUB rectangle (BYVAL x, BYVAL y, BYVAL w, BYVAL h, BYVAL c, BYVAL p) DECLARE SUB setwait (t(), BYVAL w) DECLARE SUB dowait DECLARE FUNCTION Keyseg () DECLARE FUNCTION keyoff () DECLARE FUNCTION keyval (BYVAL a) DECLARE FUNCTION getkey () TYPE Regtype ax AS INTEGER bx AS INTEGER cx AS INTEGER dx AS INTEGER bp AS INTEGER si AS INTEGER di AS INTEGER flags AS INTEGER ds AS INTEGER es AS INTEGER END TYPE DIM SHARED regs AS Regtype regs.ax = &H3509: CALL interruptx(&H21, regs, regs) off9 = regs.bx: seg9 = regs.es regs.ax = &H2509: regs.ds = Keyseg: regs.dx = keyoff CALL interruptx(&H21, regs, regs) DIM tmr(1), pic(630), bob(315), trgt(315), jb(4), st(315), boss(315), dr(315), fall(315), zxi$(13), wnd(315) DIM titlepal(128), palet(128), destroy(10), sguns(10) DIM newpal(767), tmp(32000), shts(16000), styp(45), voc(32000), txt(1024) DIM spnt(15) init: RANDOMIZE TIMER setitup "cowbob.snd" + CHR$(0), voc(), tmp(), 2 resetdsp DEF SEG = VARSEG(txt(0)) BLOAD "bobtext.fnt", VARPTR(txt(0)) setfont txt() SETMODEX setpal newpal() DEF SEG = VARSEG(newpal(0)) BLOAD "PALETTE.STO", VARPTR(newpal(0)) DEF SEG = VARSEG(titlepal(0)) BLOAD "title.pal", VARPTR(titlepal(0)) tpal = 32 setmouse jb() setdiskpages tmp(), 200, 0 cp = 0: vp = 1 title: bigbob = 0 bobtime = 0 gun = -1 coin = -1 bigo = -1 gamex = 120 gamey = 80 gamexs = 1 gameys = 1 optionx = 170 optiony = 160 optionxs = 4 optionys = 0 boardp = 0 loadpage "title.scr" + CHR$(0), 0, 2 loadpage "title.scr" + CHR$(0), 1, 3 loadsprite trgt(), 0, 150, 25, 25, 3 setvispage 2 fadetopal newpal(), tmp() setkeys selection = 0 pointer = 0 textcolor 15, 0 DO setkeys copypage 2, cp setwait tmr(), 80 readmouse jb() x = jb(0) y = jb(1) IF keyval(1) > 1 THEN selection = -1 IF keyval(28) > 1 THEN selection = 1 + pointer SELECT CASE bigbob CASE 0 bigbobp = 0 bobtime = bobtime + 1 IF bobtime = 19 THEN bigbobp = 1 IF bobtime = 20 THEN bigbobp = 2: coin = 0: coinx = 95: coiny = 140: coinxs = 5: coinys! = -9: bobtime = 0: bigbob = 1 CASE 1 bigbobp = 3 bobtime = bobtime + 1 IF bobtime = 10 THEN gun = 0: gunx = 113: guny = 143: bobtime = 0: bigbob = 2 CASE 2 bigbobp = 4 gun = 1: gunx = 110: guny = 130 bobtime = bobtime + 1 IF bobtime = 10 THEN bigbobp = 2: coin = -1: bigo = 0: bigox = 190: bigoy = 35: playsnd 2, 160 IF bobtime = 11 THEN bobtime = 0: bigbob = 3 CASE 3 bigbobp = 3 gun = 0: gunx = 113: guny = 143 bobtime = bobtime + 1 IF bobtime = 10 THEN bobtime = 0: bigbob = 4 CASE 4 gun = -1 bigbobp = 0 END SELECT gamex = gamex + gamexs IF gamex < 1 THEN gamex = 1: gamexs = ABS(gamexs) IF gamex > 269 THEN gamex = 269: gamexs = -ABS(gamexs) gamey = gamey + gameys IF gamey < 70 THEN gameys = gameys + 1 ELSE IF gamey > 90 THEN gameys = gameys - 1 ELSE gameys = gameys + INT(RND(1) * 3) - 1 gamexs = gamexs + INT(RND(1) * 5) - 2 IF gamexs < -8 THEN gamexs = -8 ELSE IF gamexs > 8 THEN gamexs = 8 IF gameys < -6 THEN gameys = -6 ELSE IF gameys > 6 THEN gameys = 6 optionx = optionx + optionxs IF optionx < 50 THEN optionx = 50: optionxs = ABS(optionxs) IF optionx > 270 THEN optionx = 270: optionxs = -ABS(optionxs) optiony = optiony + optionys IF optiony < 160 THEN optionys = optionys + 1 ELSE optiony = 160 optionys = -INT(RND(1) * 1.05) * (INT(RND(1) * 8)) optionxs = optionxs + (INT(RND(1) * 7) - 3) IF optionxs < -8 THEN optionxs = -8 ELSE IF optionxs > 8 THEN optionxs = 8 END IF IF jb(3) > 0 THEN playsnd 1, 160 IF jb(0) > gamex - 5 AND jb(0) < gamex + 31 AND jb(1) > gamey - 12 AND jb(1) < gamey + 3 THEN selection = 1 END IF IF boardp = 0 THEN boardpc = 2 ELSE IF boardp = 4 THEN boardpc = -2 boardp = boardp + boardpc loadsprite pic(), 0, bigbobp * 4, 50, 50, 3 drawsprite pic(), titlepal(), 0, 100, 120, cp IF coin > -1 THEN coin = coin + 1: IF coin > 5 THEN coin = 0 coinx = coinx + coinxs coiny = coiny + coinys! coinys! = coinys! + .5 loadsprite pic(), 0, coin + 26, 9, 10, 3 drawsprite pic(), titlepal(), 16, coinx, coiny, cp END IF IF gun > -1 THEN loadsprite pic(), 0, gun * 2 + 20, 30, 30, 3 drawsprite pic(), titlepal(), 16, gunx, guny, cp END IF IF bigo > -1 THEN loadsprite pic(), 0, bigo * 2 + 32, 30, 30, 3 drawsprite pic(), titlepal(), 16, bigox + bigo, bigoy - bigo * 2, cp IF bigo < 5 THEN bigo = bigo + 1 END IF loadsprite pic(), 0, 44 + boardp, 50, 15, 3 drawsprite pic(), titlepal(), 48, gamex, gamey, cp loadsprite pic(), 0, 56 + boardp, 40, 30, 3 drawsprite pic(), titlepal(), 48, optionx, optiony, cp drawsprite trgt(), titlepal(), tpal, x, y, cp SWAP vp, cp setvispage vp dowait LOOP WHILE selection = 0 IF selection = -1 THEN GOTO endgame DEF SEG = VARSEG(shts(0)) BLOAD "saloon.whr", VARPTR(shts(0)) DEF SEG = VARSEG(palet(0)) BLOAD "saloon.pal", VARPTR(palet(0)) DEF SEG = VARSEG(styp(0)) BLOAD "saloon.des", VARPTR(styp(0)) spnt(1) = 1 spnt(2) = 1 spnt(3) = 0 spnt(4) = 70 spnt(5) = 40 spnt(6) = 40 spnt(7) = 100 spnt(8) = 100 spnt(9) = 100 spnt(10) = 3 FOR i = 1 TO 10: destroy(i) = 0: NEXT i scn$ = "saloon" loadpage scn$ + ".bck" + CHR$(0), 0, 2 cc = 0: bhgt = 165: lf = 140 rbob = 28: bbob = 0: cbob = 48: fbob = 17: dor = 16: shotp = 60: shotd = 71 spal = 0: spal2 = 16: bspal = 32: cbpal = 48: wpal = 64: rbpal = 80 fallpnt = 30: winpnt = 25: runpnt = 35: bosspnt = 40: bobpnt = -5 score& = 0: shotfired& = 0: shothit& = 0 textcolor 15, 0 loadpage scn$ + ".pic" + CHR$(0), 0, 3 shoot = 57 x = 148 y = 85 deadyou = 0 ticks = 100 shotgun = 0 mgun = 0 setkeys WHILE deadyou = 0 setwait tmr(), ticks copypage 2, cp setkeys IF keyval(74) > 1 AND ticks < 160 THEN ticks = ticks + 10 IF keyval(78) > 1 AND ticks > 40 THEN ticks = ticks - 10 IF keyval(1) > 1 THEN deadyou = 1 IF keyval(2) > 1 THEN mgun = mgun XOR 1 IF keyval(3) > 1 THEN shotgun = shotgun XOR 1 readmouse jb() x = jb(0) y = jb(1) jb(2) = jb(2) OR keyval(shoot) jb(3) = jb(3) OR (keyval(shoot) AND 2) IF wate > 0 THEN wate = wate - 1: GOTO noshoot IF NOT (mgun) AND jb(3) > 0 THEN wsp = 1: sx = x: sy = y: playsnd 1, 160: wate = 1 IF mgun AND (jb(2) AND 1) > 0 THEN wsp = 1: sx = x: sy = y: playsnd 1, 160: IF uzi = 0 THEN uzi = 2 noshoot: IF uzi > 0 THEN uzi = uzi - 1 IF lf < 1 THEN playsnd 15, 160: deadyou = 1 ELSE rectangle 304, 9, 12, lf / 2 + 2, 14, cp: rectangle 305, 10, 10, lf / 2, 4, cp printstr "Score - " + STR$(score&), 0, 0, cp IF shotfired& > 0 THEN hitpercent = INT(100 * shothit& / shotfired&) ELSE hitpercent = 0 IF keyval(41) > 0 THEN printstr "Hits -" + STR$(hitpercent) + "%", 0, 10, cp IF cb = 0 THEN loadsprite dr(), 0, dor, 25, 25, 3: cb = INT((RND(1) * 25) / 24): bw = 0: GOTO drawdoors IF cb = 1 THEN playsnd 14, 160 loadsprite dr(), 0, dor + 1, 25, 25, 3: loadsprite boss(), 0, bbob + cb, 25, 25, 3 IF cb < 3 THEN cb = cb + 1 ELSE IF bw = 12 THEN IF cb < 6 THEN cb = cb + 1 ELSE cb = 0: bw = 0 ELSE bw = bw + 1 IF wsp = 1 AND ABS(sx - 147) < 13 AND ABS(sy - 150) < 13 THEN loadsprite boss(), 0, bbob + 13, 25, 25, 3: cb = 0: wsp = 2: score& = score& + bosspnt: playsnd 26 + INT(RND(1) * 2), 160 IF cb = 5 THEN lf = lf - 8: playsnd 1, 160 drawsprite boss(), palet(), bspal, 147, 150, cp drawdoors: drawsprite dr(), palet(), bspal, 161, 150, cp wardsprite dr(), palet(), bspal, 135, 150, cp IF ddw = 0 THEN GOTO cowbobs loadsprite wnd(), 0, cbob + wb, 25, 25, 3 wb = wb + 1 IF wb = 12 THEN ddw = 0: wb = 0 GOTO drawcbob cowbobs: IF wb = 0 THEN wb = INT((RND(1) * 16) / 15): wx = 147 + INT(RND(1) * 2) * 200 - 100: wy = 124: wst = 0: GOTO falling loadsprite wnd(), 0, cbob + wb, 25, 25, 3 IF wb < 3 THEN wb = wb + 1 ELSE IF wst = 15 THEN IF wb < 6 THEN wb = wb + 1 ELSE wb = 3: wst = 0 ELSE wst = wst + 1 IF wsp = 1 AND ABS(sx - wx) < 13 AND ABS(sy - wy) < 12 THEN loadsprite wnd(), 0, cbob + 7, 25, 25, 3: wb = 7: ddw = 1: wsp = 2: score& = score& + winpnt: playsnd 16 + INT(RND * 7), 160 IF wb = 5 THEN lf = lf - 5: playsnd 2, 160 drawcbob: drawsprite wnd(), palet(), wpal, wx, wy, cp falling: IF fdd = 0 THEN GOTO dofbob fbx = fbx + fxd fby = fby + 20 IF fby > bhgt THEN fby = bhgt + INT(RND(1) * 7): loadsprite fall(), 0, fbob + 9 + INT(RND(0) * 3), 25, 25, 3: bhgt = bhgt - INT(RND(1) * 50 / 49): drawsprite fall(), palet(), cbpal, fbx, fby, 2: fdd = 0: fb = 0: GOSUB fallbody: playsnd 13, 160: GOTO _ drawfbob loadsprite fall(), 0, fbob + 8, 25, 25, 3 GOTO drawfbob dofbob: IF fb = 0 THEN fb = INT((RND(1) * 19) / 18): fbx = 47 + INT(RND(1) * 3) * 100: fxd = INT(RND(1) * 9) - 4: fby = 50: GOTO running loadsprite fall(), 0, fbob + fb, 25, 25, 3 IF fb < 3 THEN fb = fb + 1 ELSE IF fw = 15 THEN IF fb < 6 THEN fb = fb + 1 ELSE fb = 3: fw = 0 ELSE fw = fw + 1 IF wsp = 1 AND ABS(sx - fbx) < 13 AND ABS(sy - 50) < 13 THEN loadsprite fall(), 0, fbob + 7, 25, 25, 3: fb = 7: fw = 0: fdd = 1: wsp = 2: score& = score& + fallpnt: playsnd 19 + INT(RND(1) * 7), 160 IF fb = 5 THEN lf = lf - 5: playsnd 3, 160 drawfbob: drawsprite fall(), palet(), cbpal, fbx, fby, cp running: IF ddb = 0 THEN GOTO dorbob bp = bp + 1 loadsprite bob(), 0, rbob + bp + nicebob * 10, 25, 25, 3 IF bp = 10 THEN ddb = 0: bp = 0: by = by - INT(RND(1) * 6): GOSUB runbody: IF bxd > 0 THEN wardsprite bob(), palet(), rbpal + nicebob * 16, bx, by, 2 ELSE drawsprite bob(), palet(), rbpal + nicebob * 16, bx, by, 2 IF bxd > 0 THEN wardsprite bob(), palet(), rbpal + nicebob * 16, bx, by, cp ELSE drawsprite bob(), palet(), rbpal + nicebob * 16, bx, by, cp GOTO shots dorbob: IF bp = 0 THEN bp = INT((RND(1) * 15) / 14): bxd = INT(RND(1) * 2) * 14 - 7: bx = 148 - 147 * SGN(bxd): by = 175 - INT((RND(1) * 4) / 3) * 108: nicebob = INT(RND(1) * 2): GOTO shots bp = bp + 1: IF bp = 4 OR bp = 7 THEN bp = 1 bx = bx + bxd: IF bx < 0 OR bx > 295 THEN bp = 0: GOTO shots IF ABS(bx - 148) < 4 THEN bp = 4: IF nicebob = 1 THEN lf = lf - 4: playsnd 2, 160 IF ABS(bx - sx) < 13 AND ABS(by - sy) < 13 AND wsp = 1 THEN bp = 7: ddb = 1: wsp = 2: playsnd 17 + INT(RND(1) * 8), 160: IF nicebob = 1 THEN score& = score& + bobpnt ELSE score& = score& + runpnt loadsprite bob(), 0, rbob + bp + nicebob * 10, 25, 25, 3 IF bxd > 0 THEN wardsprite bob(), palet(), rbpal + nicebob * 16, bx, by, cp ELSE drawsprite bob(), palet(), rbpal + nicebob * 16, bx, by, cp shots: IF wsp = 0 THEN GOTO target IF wsp = 2 THEN loadsprite st(), 0, shotp, 25, 25, 3: playsnd 8, 160 shotguns = 0: oldsx = sx: oldsy = sy FOR i = 1 TO 10: sguns(i) = 0: NEXT i moshots: whr = shts(INT((sx + 12) / 2) + INT((sy + 12) / 2) * 160) shotfired& = shotfired& + 1 IF wsp = 2 THEN shothit& = shothit& + 1 IF wsp = 1 THEN loadsprite st(), 0, shotp + whr, 25, 25, 3 IF sguns(whr) = 0 AND (wsp = 2 OR (whr > 0 AND (mgun = 0 OR uzi > 0))) THEN drawsprite st(), palet(), spal, sx, sy, cp IF wsp = 1 AND whr > 0 THEN IF (styp(whr * 3 + 1) = 0 OR destroy(whr) = 0) THEN score& = score& + spnt(whr): destroy(whr) = destroy(whr) + 1: IF whr > 3 THEN shothit& = shothit& + 1 IF sguns(whr) = 0 THEN playsnd 3 + whr, 160: sguns(whr) = 1 loadsprite st(), 0, shotd + whr, 25, 25, 3 IF styp(whr * 3 + 1) = 1 THEN drawsprite st(), palet(), spal2, styp(whr * 3 + 2), styp(whr * 3 + 3), 2 ELSE drawsprite st(), palet(), spal2, sx, sy, 2 END IF IF shotguns < 6 AND shotgun THEN shotguns = shotguns + 1: sx = oldsx + INT(RND(1) * 19) - 9: sy = oldsy + INT(RND(1) * 19) - 9: GOTO moshots target: wsp = 0: drawsprite trgt(), titlepal(), tpal, x, y, cp cc = cc + 1: IF cc > 7 THEN cc = 0 SWAP cp, vp setvispage vp dowait WEND fadeto tmp(), 63, 0, 0 endgame: regs.ax = &H2509: regs.ds = seg9: regs.dx = off9 CALL interruptx(&H21, regs, regs) closefile fadeto tmp(), 0, 0, 0 SCREEN 7: CLS : SCREEN 0: WIDTH 80 SYSTEM runbody: blud = INT((bx + 2) / 2) + INT((by + 13) / 2) * 160 FOR j = 0 TO 480 STEP 160 FOR i = 1 TO 10 shts(blud + i + j) = 10 NEXT i NEXT j RETURN fallbody: blud = INT((fbx + 3) / 2) + INT((fby + 15) / 2) * 160 FOR j = 0 TO 640 STEP 160 FOR i = 1 TO 9 shts(blud + i + j) = 10 NEXT i NEXT j RETURN