'$DYNAMIC DEFINT A-Z DECLARE FUNCTION small% (n1%, n2%) DECLARE FUNCTION large% (n1%, n2%) DECLARE FUNCTION loopvar% (var%, min%, max%, inc%) DECLARE SUB setmodex () DECLARE SUB copypage (BYVAL page1, BYVAL page2) DECLARE SUB setvispage (BYVAL page) DECLARE SUB drawsprite (pic(), pal(), BYVAL po, BYVAL x, BYVAL y, BYVAL page) DECLARE SUB wardsprite (pic(), pal(), BYVAL po, BYVAL x, BYVAL y, BYVAL page) DECLARE SUB loadsprite (pic(), BYVAL x, BYVAL y, BYVAL w, BYVAL h, BYVAL page) DECLARE SUB stosprite (pic(), BYVAL x, BYVAL y, BYVAL page) DECLARE SUB fadeto (palbuff(), BYVAL red, BYVAL green, BYVAL blue) DECLARE SUB fadetopal (pal(), palbuff()) DECLARE SUB setpal (pal()) DECLARE SUB clearpage (BYVAL page) 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 setitup (fil$, buff(), tbuff(), BYVAL p) DECLARE SUB resetdsp DECLARE SUB playsnd (BYVAL n, BYVAL f) DECLARE SUB closefile DECLARE SUB rectangle (BYVAL x, BYVAL y, BYVAL w, BYVAL h, BYVAL c, BYVAL p) DECLARE SUB setwait (b(), BYVAL t) DECLARE SUB dowait () DECLARE SUB setmouse (mouse()) DECLARE SUB readmouse (mouse()) DECLARE FUNCTION Keyseg () DECLARE FUNCTION keyoff () DECLARE FUNCTION keyval (BYVAL a) DECLARE FUNCTION getkey () DECLARE FUNCTION ipxsetup DECLARE FUNCTION opensock (BYVAL socknum) DECLARE SUB closesock DECLARE SUB sendpack (p(), BYVAL l, a$) DECLARE SUB getpack (p(), BYVAL l) DECLARE FUNCTION waitpack DECLARE SUB cancelsend DECLARE SUB cancelget DECLARE SUB getaddress (a$) 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 DIM font(1024), master(767), noise(16384), buffer(16384), pal(1584), timing(4), mouse(4) DIM starx(100), stary(100), starz(100), gun(4), shot(10), tell(10), listen(10), placer(320) RANDOMIZE TIMER fadeto buffer(), 0, 0, 0 setmodex setitup "noise.cbv" + CHR$(0), noise(), buffer(), 2 resetdsp GOSUB switchon DEF SEG = VARSEG(master(0)): BLOAD "master.pal", VARPTR(master(0)) DEF SEG = VARSEG(font(0)): BLOAD "font.fnt", VARPTR(font(0)): setfont font(): textcolor 15, 0 DEF SEG = VARSEG(pal(0)): BLOAD "ufo.pal", VARPTR(pal(0)) dpage = 1: vpage = 0: ex = 160: ey = 100: star = 99: hp = 40: rate = 160 all$ = STRING$(6, 255) + STRING$(4, 0) + STRING$(6, 255) other$ = STRING$(16, " ") FOR i = 0 TO star starx(i) = INT(RND * 320) stary(i) = INT(RND * 200) starz(i) = INT(RND * 15) NEXT i setmouse mouse() IF mouse(0) = 0 THEN setpal master(): printstr "You need a mouse with a DOS driver", 0, 0, 0: w = getkeys: GOTO finis IF ipxsetup = 0 THEN setpal master(): printstr "Sorry, bub. No network card.", 0, 0, 0: w = getkeys: GOTO finis IF opensock(&HF180) = 0 THEN setpal master(): printstr "AAAAAAUG! Bad Socket!", 0, 0, 0: w = getkeys: GOTO finis tell(0) = 144 printstr "Seeking a foe...", 0, 0, 0: fadetopal master(), buffer() setkeys DO setkeys sendpack tell(), 1, all$ getpack listen(), 1 t# = TIMER + .5 WHILE waitpack AND t# > TIMER: WEND IF waitpack = 0 AND listen(0) = 144 THEN getaddress other$: EXIT DO IF keyval(1) > 1 THEN printstr "Never mind. Dont wanna connect", 0, 8, 0: w = getkeys: GOTO finis cancelget LOOP printstr "Whoop, I think I found one...", 0, 8, 0 sendpack tell(), 1, other$ t# = TIMER + 1: WHILE t# > TIMER: WEND getpack listen(), 22 printstr "Spiffy! The connection was confirmed.", 0, 16, 0 t# = TIMER + 1: WHILE t# > TIMER: WEND FOR i = 0 TO 4 DEF SEG = VARSEG(placer(0)): BLOAD "ufo." + RIGHT$(STR$(i), LEN(STR$(i)) - 1), VARPTR(placer(0)) stosprite placer(), 0, i, 2 NEXT i setkeys DO setwait timing(), 80 setkeys GOSUB inputage GOSUB packetage GOSUB gameage GOSUB drawage IF quit > 0 THEN quit = quit + 1 dowait LOOP UNTIL quit > 2 textcolor 15, 0 printstr quit$, 160 - LEN(quit$) * 4, 2, vpage w = getkey GOTO finis inputage: up = 0 down = 0 left = 0 right = 0 readmouse mouse() mx = large(small(mouse(0), 315), 4) my = large(small(mouse(1), 195), 4) IF keyval(1) > 1 THEN quit = 1: quit$ = "Game aborted" IF keyval(72) > 0 OR my = 4 THEN 'ey = ey + 12 goo = 1 up = 1 END IF IF keyval(80) > 0 OR my = 195 THEN 'ey = ey - 12 goo = 2 down = 1 END IF IF keyval(75) > 0 OR mx = 4 THEN 'ex = ex + 12 goo = 3 left = 1 END IF IF keyval(77) > 0 OR mx = 315 THEN 'ex = ex - 12 goo = 4 right = 1 END IF IF mouse(2) = 1 OR keyval(57) > 0 THEN i = 0: WHILE gun(ngun) < 10 AND i < 4: ngun = loopvar(ngun, 0, 3, 1): i = i + 1: WEND IF i < 4 THEN fired = ngun gun(ngun) = 0 playsnd 1, rate END IF END IF RETURN packetage: 'construct packet listen(0) = 0 tell(0) = 145 + quit tell(1) = up tell(2) = down tell(3) = left tell(4) = right tell(5) = fired tell(6) = hit tell(7) = goo tell(8) = hp tell(9) = ex tell(10) = ey sendpack tell(), 22, other$ t# = TIMER + 3 WHILE waitpack IF t# < TIMER THEN printstr "Connection lost.", 160 - 16 * 4, 16, vpage: RETURN finis WEND getpack listen(), 22 'use aquired packet IF listen(0) = 146 THEN quit = 1: quit$ = "Other guy quit." IF listen(5) > -1 THEN playsnd 2, rate IF listen(6) = 1 THEN rectangle 0, 0, 320, 200, 4, dpage: hp = large(0, hp - 1): playsnd 4, rate IF listen(7) > 0 THEN rota = loopvar(rota, 0, 3, 1) RETURN gameage: IF listen(8) < 1 AND done = 0 AND quit = 0 THEN done = 10: done$ = "Hahaha! You got him!" IF hp < 1 AND done = 0 AND quit = 0 THEN done = 10: done$ = "No! No! It cannot be!" tog = tog XOR 1 IF goo = 0 THEN FOR i = 0 TO 3: gun(i) = small(gun(i) + 1, 10): NEXT IF up = 1 THEN y1 = small(y1 + 4, 12) FOR i = 0 TO star stary(i) = stary(i) + (INT(starz(i) / 2) + 1) / (13 - ABS(y1)) IF stary(i) > 200 THEN stary(i) = stary(i) - 200: starx(i) = INT(RND * 320) NEXT i END IF IF down = 1 THEN y1 = large(y1 - 4, -12) FOR i = 0 TO star stary(i) = stary(i) - (INT(starz(i) / 2) + 1) / (13 - ABS(y1)) IF stary(i) < 0 THEN stary(i) = stary(i) + 200: starx(i) = INT(RND * 320) NEXT i END IF IF left = 1 THEN x1 = small(x1 + 4, 12) FOR i = 0 TO star starx(i) = starx(i) + (INT(starz(i) / 2) + 1) / (13 - ABS(x1)) IF starx(i) > 320 THEN starx(i) = starx(i) - 320: stary(i) = INT(RND * 200) NEXT i END IF IF right = 1 THEN x1 = large(x1 - 4, -12) FOR i = 0 TO star starx(i) = starx(i) - (INT(starz(i) / 2) + 1) / (13 - ABS(x1)) IF starx(i) < 0 THEN starx(i) = starx(i) + 320: stary(i) = INT(RND * 200) NEXT i END IF IF listen(1) = 1 THEN y2 = large(y2 - 4, -12) IF listen(2) = 1 THEN y2 = small(y2 + 4, 12) IF listen(3) = 1 THEN x2 = small(x2 + 4, 12) IF listen(4) = 1 THEN x2 = large(x2 - 4, -12) IF ex <> listen(9) THEN ex = (ex + listen(9)) / 2 IF ey + listen(10) <> 200 THEN ey = ey + (200 - (ey + listen(10))) \ 2 ey = ey + y1 ey = ey + y2 ex = ex + x1 ex = ex + x2 IF (ABS(x2) = 12 OR ABS(y2) = 12) AND tog = 0 THEN playsnd 5, rate y1 = y1 - SGN(y1) * 2 y2 = y2 - SGN(y2) * 2 x1 = x1 - SGN(x1) * 2 x2 = x2 - SGN(x2) * 2 IF goo > 0 THEN goo = 0 hit = 0 RETURN drawage: FOR i = 0 TO star rectangle starx(i), stary(i), 1, 1, 240 + starz(i), dpage NEXT i textcolor 10 + tog * 5, 0 IF ex > -16 AND ex < 336 AND ey > 9 AND ey < 190 THEN loadsprite placer(), 0, rota, 32, 20, 2: drawsprite placer(), pal(), 0, ex - 16, ey - 10, dpage rectangle 269, 3, 48, 1, 7, dpage rectangle 269, 50, 48, 1, 7, dpage rectangle 269, 3, 1, 48, 7, dpage rectangle 317, 3, 1, 48, 7, dpage rectangle 285, 24, 16, 10, 8, dpage rectangle 285 + INT(ex / 20), 24 + INT(ey / 20), 1, 1, 9 + tog * 6, dpage FOR i = 0 TO 3 rectangle 2, 2 + i * 6, gun(i) * 2, 4, 4, dpage IF fired = i THEN rectangle 2, 2 + i * 6, 20, 4, 12, dpage NEXT i IF fired > -1 THEN IF mx > ex - 14 AND mx < ex + 14 AND my > ey - 8 AND my < ey + 8 THEN hit = 1: loadsprite placer(), 0, 4, 32, 20, 2: drawsprite placer(), pal(), 1 * 16, mx - 16, my - 10, dpage: playsnd 3, rate rectangle mx, my, 1, 199 - my, 14, dpage END IF fired = -1 rectangle 160 - 21, 2, 42, 6, 2, dpage rectangle 160 - INT(hp / 2), 3, hp, 4, 10, dpage printstr "+", mx - 2, my - 3, dpage IF keyval(51) > 0 THEN star = large(0, star - 1): printstr "Starfield" + STR$(star), 0, 190, dpage IF keyval(52) > 0 THEN star = small(99, star + 1): printstr "Starfield" + STR$(star), 0, 190, dpage IF done > 0 THEN printstr done$, 160 - LEN(done$) * 4, 10, dpage: quit = 1: quit$ = "Game Over": done = done - 1 SWAP vpage, dpage setvispage vpage clearpage dpage RETURN finis: fadeto buffer(), 0, 0, 0 closesock GOSUB shutoff SCREEN 13: SYSTEM switchon: regs.ax = &H2509: regs.ds = Keyseg: regs.dx = keyoff CALL interruptx(&H21, regs, regs) RETURN shutoff: regs.ax = &H2509: regs.ds = seg9: regs.dx = off9 CALL interruptx(&H21, regs, regs) RETURN REM $STATIC FUNCTION large (n1, n2) large = n1 IF n2 > n1 THEN large = n2 END FUNCTION FUNCTION loopvar (var, min, max, inc) a = var + inc IF a > max THEN a = min IF a < min THEN a = max loopvar = a END FUNCTION FUNCTION small (n1, n2) small = n1 IF n2 < n1 THEN small = n2 END FUNCTION