'ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ 'Û BY JESTER / PHILIPP LENSSEN ÛÛ (except Mousedriver, which I only modified) 'ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛ ' ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß DECLARE SUB MouseDriver (AX%, bx%, CX%, DX%) DECLARE SUB mousestatus (button(), cursor()) DECLARE FUNCTION MouseInit% () SCREEN 12: COLOR 12: RANDOMIZE TIMER DO CLEAR : CLS : DIM SHARED Mouse$: CONST nrmax = 30, mulx = 20 DIM p(3, nrmax), spd(3), cursor(2), button(2), lim(3), mul, size, cr AS INTEGER lim(1) = 640: lim(2) = 480: lim(3) = 20: WINDOW SCREEN (1, 1)-(lim(1), lim(2)) GOSUB resize GOSUB maus FOR nr = 1 TO nrmax FOR cr = 1 TO 3: p(cr, nr) = p(cr, nr) + INT(RND * lim(cr)): NEXT NEXT DO mousestatus button(), cursor() t% = t% + 1: IF t% = 150 THEN t% = 0: CLS FOR cr = 1 TO 2 spd(cr) = mulx / 2 + 1 FOR mul = 0 TO mulx spd(cr) = spd(cr) - 1 IF cursor(cr) >= (lim(cr) / mulx) * mul AND cursor(cr) < (lim(cr) / mulx) * (mul + 1) THEN mul = mulx + 1 NEXT NEXT IF button(1) = -1 AND shoot% = 0 THEN shoot% = 500 LINE (lim(1) / 2, lim(2) / 2)-(lim(1) / 2 - 20, lim(2)), 10: LINE (lim(1) / 2, lim(2) / 2)-(lim(1) / 2 + 20, lim(2)), 10 PAINT (lim(1) / 2, lim(2)), 10, 10 ELSEIF shoot% > 0 THEN shoot% = shoot% - 100 SOUND shoot% + 3000, .03 IF shoot% = 400 THEN PAINT (lim(1) / 2, lim(2)), 0, 11 ELSEIF button(2) = -1 THEN GOSUB resize END IF FOR nr = 1 TO nrmax IF nr < nrmax THEN LINE (p(1, nr) - p(3, nr) / 2, p(2, nr) - p(3, nr) / 2)-(p(1, nr) + p(3, nr) / 2, p(2, nr) + p(3, nr) / 2), 0, BF ELSEIF p(3, nr) >= 0 AND p(3, nr) < 20 THEN CIRCLE (p(1, nr), p(2, nr)), p(3, nr) / 2 + alsize, 0 PAINT STEP(0, 0), 0, 0 LINE (p(1, nr) - (p(3, nr) / 2 + (alsize + alsize / 2)), p(2, nr))-(p(1, nr) + (p(3, nr) / 2 + (alsize + alsize / 2)), p(2, nr)), 0 LINE (p(1, nr) - (p(3, nr) / 2 + (alsize + alsize / 2)), p(2, nr) - (p(3, nr) / 2 + alsize))-STEP(0, (p(3, nr) / 2 + alsize) * 2), 0 LINE (p(1, nr) + (p(3, nr) / 2 + (alsize + alsize / 2)), p(2, nr) - (p(3, nr) / 2 + alsize))-STEP(0, (p(3, nr) / 2 + alsize) * 2), 0 IF zzl% = 1 THEN PAINT (lim(1) / 2, lim(2)), 0, 14 LINE (p(1, nr), p(2, nr))-(lim(1) / 2 - 20, lim(2)), 0 LINE (p(1, nr), p(2, nr))-(lim(1) / 2 + 20, lim(2)), 0 SOUND 100, .05 END IF END IF FOR cr = 1 TO 2 IF cursor(cr) < lim(cr) * 2 / 10 THEN cursor(cr) = lim(cr) * 2 / 10 IF cursor(cr) > lim(cr) * 8 / 10 THEN cursor(cr) = lim(cr) * 8 / 10 IF p(cr, nr) <= cursor(cr) THEN p(cr, nr) = p(cr, nr) - p(3, nr) * 2 + spd(cr) * 2 IF p(cr, nr) > cursor(cr) THEN p(cr, nr) = p(cr, nr) + p(3, nr) * 2 + spd(cr) * 2 IF p(cr, nr) >= lim(cr) OR p(cr, nr) <= 1 THEN IF nr < nrmax THEN FOR cr = 1 TO 2 IF INT(RND * 3) + 1 = 1 THEN IF p(cr, nr) > lim(cr) THEN p(cr, nr) = 2 IF p(cr, nr) <= 1 THEN p(cr, nr) = lim(cr) + 1 ELSE zz% = INT(RND * 50): IF INT(RND * 2) + 1 = 1 THEN zz% = zz% * -1 p(cr, nr) = cursor(cr) + zz% END IF p(3, nr) = 1 NEXT ELSE : p(3, nr) = -100 END IF END IF IF shoot% = 500 AND nr = nrmax AND p(3, nr) > 0 THEN IF p(cr, nr) > lim(cr) / 2 - (p(3, nr) + alsize * 2) AND p(cr, nr) < lim(cr) / 2 + (p(3, nr) + alsize * 2) THEN hit% = hit% + 1 IF hit% = 2 THEN SOUND 1000, .5: p(3, nr) = -100: hits% = hits% + 1 IF size > 0 THEN VIEW: LINE (21, 91)-STEP(18, hits% * (300 / 20) - 2), 4, BF VIEW (lim(1) * ((0 + size) / 10), lim(2) * ((0 + size) / 10))-(lim(1) * ((10 - size) / 10), lim(2) * ((10 - size) / 10)), , 12 END IF END IF END IF NEXT IF nr < nrmax THEN stp = .3 IF nr = nrmax THEN stp = .02: IF alsize < 10 THEN alsize = alsize + .5 IF p(3, nr) < lim(3) THEN p(3, nr) = p(3, nr) + stp IF nr < nrmax THEN IF p(3, nr) / 2 > 0 THEN LINE (p(1, nr) - p(3, nr) / 2 + 1, p(2, nr) - p(3, nr) / 2 + 1)-(p(1, nr) + p(3, nr) / 2 - 1, p(2, nr) + p(3, nr) / 2 - 1), 11, BF LINE (p(1, nr) - p(3, nr) / 2, p(2, nr) - p(3, nr) / 2)-(p(1, nr) + p(3, nr) / 2, p(2, nr) + p(3, nr) / 2), 9, B ELSEIF p(3, nrmax) > -5 AND p(3, nrmax) <= 0 THEN FOR cr = 1 TO 2: p(cr, nrmax) = INT(RND * lim(cr) / 2) + lim(cr) / 3: NEXT: alsize = 0 ELSEIF p(3, nr) > 0 AND p(3, nr) < 20 THEN CIRCLE (p(1, nr), p(2, nr)), p(3, nr) / 2 + alsize, 14 PAINT STEP(0, 0), 10, 14 LINE (p(1, nr) - (p(3, nr) / 2 + (alsize + alsize / 2)), p(2, nr))-(p(1, nr) + (p(3, nr) / 2 + (alsize + alsize / 2)), p(2, nr)), 10 LINE (p(1, nr) - (p(3, nr) / 2 + (alsize + alsize / 2)), p(2, nr) - (p(3, nr) / 2 + alsize))-STEP(0, (p(3, nr) / 2 + alsize) * 2), 14 LINE (p(1, nr) + (p(3, nr) / 2 + (alsize + alsize / 2)), p(2, nr) - (p(3, nr) / 2 + alsize))-STEP(0, (p(3, nr) / 2 + alsize) * 2), 14 zzl% = INT(RND * 30) IF zzl% = 1 THEN LINE (p(1, nr), p(2, nr))-(lim(1) / 2 - 20, lim(2)), 14 LINE (p(1, nr), p(2, nr))-(lim(1) / 2 + 20, lim(2)), 14 PAINT (lim(1) / 2, lim(2)), 15, 14: SOUND 1000, .1 shield% = shield% + 1 IF size > 0 THEN VIEW: LINE (601, 91)-STEP(18, shield% * (300 / 40) - 2), 4, BF VIEW (lim(1) * ((0 + size) / 10), lim(2) * ((0 + size) / 10))-(lim(1) * ((10 - size) / 10), lim(2) * ((10 - size) / 10)), , 12 END IF END IF END IF NEXT IF p(3, nrmax) < 0 THEN p(3, nrmax) = p(3, nrmax) + 1 hit% = 0 IF size > 0 THEN crot% = crot% + 1 IF crot% <= 10 THEN col$ = "12" ELSEIF crot% > 10 AND crot% <= 20 THEN col$ = "4" ELSE : crot% = 0 END IF FOR wn% = 0 TO 3: DRAW "a" + STR$(wn%) + "bm320,240c" + col$ + "s20bubuuuu": NEXT END IF LOOP UNTIL hits% = 20 OR shield% = 40 OR INKEY$ = CHR$(27) CLS IF hits% = 20 THEN LOCATE 28, 16: PRINT "CONGRATULATIONS! YOUR HOMETOWN IS ONCE AGAIN SAFE." ELSEIF shield% = 40 THEN LOCATE 28, 27: PRINT "YOUR SHIP EXPLODED! GAME OVER." ELSE : END END IF SLEEP LOOP resize: IF size = 0 THEN size = 1 PAINT (1, 1), 4, 4 LOCATE 1, 1: PRINT "KAMIKAZE ALIENS IV: USE MOUSE TO MOVE. LEFT BUTTON IS FOR LASER. BY PHIL LENSSEN" LOCATE 2, 25: PRINT "USE RIGHT BUTTON TO RESIZE VIEW." LOCATE 5, 2: PRINT "ALIENS": LINE (20, 90)-STEP(20, 300), 12, BF LOCATE 5, 74: PRINT "SHIELD": LINE (600, 90)-STEP(20, 300), 12, BF IF hits% > 0 THEN LINE (21, 91)-STEP(18, hits% * (300 / 20) - 2), 4, BF IF shield% > 0 THEN LINE (601, 91)-STEP(18, shield% * (300 / 40) - 2), 4, BF VIEW (lim(1) * ((0 + size) / 10), lim(2) * ((0 + size) / 10))-(lim(1) * ((10 - size) / 10), lim(2) * ((10 - size) / 10)), , 12 CLS ELSE : VIEW: CLS : size = 0 END IF RETURN maus: RESTORE Mouse$ = SPACE$(57) FOR i% = 1 TO 57 READ A$: H$ = CHR$(VAL("&H" + A$)): MID$(Mouse$, i%, 1) = H$ NEXT DATA 55,89,E5,8B,5E,0C,8B,07,50,8B,5E,0A,8B,07,50,8B DATA 5E,08,8B,0F,8B,5E,06,8B,17,5B,58,1E,07,CD,33,53 DATA 8B,5E,0C,89,07,58,8B,5E,0A,89,07,8B,5E,08,89,0F DATA 8B,5E,06,89,17,5D,CA,08,00 MS% = MouseInit% IF NOT MS% THEN PRINT "Game cancelled: Mouse not found, please load driver.": END END IF RETURN SUB MouseDriver (AX%, bx%, CX%, DX%) DEF SEG = VARSEG(Mouse$) Mouse% = SADD(Mouse$) CALL Absolute(AX%, bx%, CX%, DX%, Mouse%) END SUB FUNCTION MouseInit% AX% = 0 MouseDriver AX%, 0, 0, 0 MouseInit% = AX% END FUNCTION SUB mousestatus (button(), cursor()) AX% = 3 MouseDriver AX%, bx%, CX%, DX% button(1) = ((bx% AND 1) <> 0) button(2) = ((bx% AND 2) <> 0) cursor(1) = CX% cursor(2) = DX% END SUB