RANDOMIZE TIMER DEFINT A-R DEFINT T-Z DIM x(8): DIM y(8): DIM d(8): DIM l$(8): DIM r$(8): DIM alive(8): DIM score(8): DIM power(8): DIM wrap(8): DIM pilot(8): DIM control(8): DIM distance(8) SCREEN 12: CLS PRINT "Welcome to David Morgans Amazingly Good Tron Game With PowerUps." PRINT PRINT "Controls are (you should remember these now): " PRINT "Player One: ` and 1" PRINT "Player Two: 2 and 3 (using the number pad here would be a good idea)" PRINT "Player Three: u and i" PRINT "Player Four: e and r" PRINT "Player Five: [ and ]" PRINT "Player Six: b and n" PRINT "Player Seven: . and /" PRINT "Player Eight: \ and z" PRINT PRINT "This game will automatically sets Caps Lock, etc off, with the exception of" PRINT "Num Lock which is kept on. Try changing this and see what happens..." PRINT PRINT "You can pick up various powerups: (distinguishabible by letter and color)" PRINT "Yellow: SpeedUp" PRINT "Purple: 2xShield" PRINT "Red: Quarter Screen" PRINT "Blue: WrapAround" PRINT "Green: TakeControl - gives either AutoPilot or PlayerControl" PRINT PRINT "And now, on to the game..." INPUT "Please enter a number of players, somewhere in between 1 and 8"; p FOR c = 1 TO p READ l$(c), r$(c) NEXT Restart: CLS : LOCATE 2, 3 FOR c = 1 TO p PRINT "P"; RIGHT$(STR$(c), LEN(STR$(c)) - 1); ":"; score(c); x(c) = c * (640 / (p + 2)) + (640 / (p + 2) / 2) IF c MOD 2 = 0 THEN y(c) = 440: d(c) = 0 ELSE y(c) = 80: d(c) = 2 alive(c) = 1: power(c) = 0: wrap(c) = 0: pilot(c) = 0: control(c) = 0 NEXT LINE (0, 0)-(639, 479), 9, B PowerUpColor = 14: PowerUp$ = "SU": GOSUB ShowPowerUp PowerUpColor = 13: PowerUp$ = "2S": GOSUB ShowPowerUp PowerUpColor = 12: PowerUp$ = "QS": GOSUB ShowPowerUp PowerUpColor = 11: PowerUp$ = "WA": GOSUB ShowPowerUp PowerUpColor = 10: PowerUp$ = "TC": GOSUB ShowPowerUp MainLoop: GOSUB LimitSpeed GOSUB GetInput GOSUB ProcessInput GOSUB DoAutoPilot GOSUB MovePlayers GOSUB CheckCollision GOSUB DrawPlayers GOTO MainLoop ShowPowerUp: LOCATE RND * 27 + 2, RND * 76 + 2: COLOR PowerUpColor PRINT PowerUp$; RETURN GetInput: k$ = INKEY$ IF k$ = "" THEN RETURN k$ = LCASE$(k$) RETURN ProcessInput: FOR c = 1 TO p IF k$ = l$(c) THEN d(c) = d(c) - 1 IF k$ = r$(c) THEN d(c) = d(c) + 1 IF d(c) < 0 THEN d(c) = 3 IF d(c) > 3 THEN d(c) = 0 NEXT RETURN MovePlayers: FOR c = 1 TO p IF alive(c) THEN IF d(c) = 0 THEN y(c) = y(c) - 1 IF d(c) = 1 THEN x(c) = x(c) + 1 IF d(c) = 2 THEN y(c) = y(c) + 1 IF d(c) = 3 THEN x(c) = x(c) - 1 IF wrap(c) = 1 THEN IF x(c) = 0 THEN x(c) = 638 IF x(c) = 639 THEN x(c) = 1 IF y(c) = 0 THEN y(c) = 478 IF y(c) = 479 THEN y(c) = 1 END IF IF power(c) = 1 THEN check = POINT(x(c), y(c)) IF check <> 0 AND check < 10 THEN dp = c: GOSUB KillPlayer IF check = 14 THEN power(c) = 1 IF check = 13 THEN alive(c) = 3 IF check = 12 THEN LINE (320, 4)-(320, 475), 9: LINE (4, 240)-(635, 240), 9 IF check = 11 THEN wrap(c) = 1 IF check = 10 THEN pilot(c) = 1 IF alive(c) THEN PSET (x(c), y(c)), c IF d(c) = 0 THEN y(c) = y(c) - 1 IF d(c) = 1 THEN x(c) = x(c) + 1 IF d(c) = 2 THEN y(c) = y(c) + 1 IF d(c) = 3 THEN x(c) = x(c) - 1 IF wrap(c) = 1 THEN IF x(c) = 0 THEN x(c) = 638 IF x(c) = 639 THEN x(c) = 1 IF y(c) = 0 THEN y(c) = 478 IF y(c) = 479 THEN y(c) = 1 END IF END IF END IF END IF NEXT RETURN DoAutoPilot: FOR c = 1 TO p IF pilot(c) = 1 THEN IF d(c) = 0 THEN IF POINT(x(c), y(c) - 1) THEN d(c) = 1 IF d(c) = 1 THEN IF POINT(x(c) + 1, y(c)) THEN d(c) = 2 IF d(c) = 2 THEN IF POINT(x(c), y(c) + 1) THEN d(c) = 3 IF d(c) = 3 THEN IF POINT(x(c) - 1, y(c)) THEN d(c) = 0 IF d(c) = 0 THEN IF POINT(x(c), y(c) - 1) THEN d(c) = 1 IF d(c) = 1 THEN IF POINT(x(c) + 1, y(c)) THEN d(c) = 2 IF d(c) = 2 THEN IF POINT(x(c), y(c) + 1) THEN d(c) = 3 IF d(c) = 3 THEN IF POINT(x(c) - 1, y(c)) THEN d(c) = 0 IF d(c) = 0 THEN IF POINT(x(c), y(c) - 1) THEN d(c) = 1 IF d(c) = 1 THEN IF POINT(x(c) + 1, y(c)) THEN d(c) = 2 IF d(c) = 2 THEN IF POINT(x(c), y(c) + 1) THEN d(c) = 3 IF d(c) = 3 THEN IF POINT(x(c) - 1, y(c)) THEN d(c) = 0 END IF IF control(c) THEN IF ABS(d(control(c)) - d(c)) <> 2 THEN d(control(c)) = d(c) NEXT RETURN CheckCollision: FOR c = 1 TO p IF alive(c) THEN check = POINT(x(c), y(c)) IF check <> 0 AND check < 10 THEN dp = c: GOSUB KillPlayer: IF c = 9 THEN RETURN IF check = 14 THEN power(c) = 1 IF check = 13 THEN alive(c) = 3 IF check = 12 THEN LINE (320, 4)-(320, 475), 9: LINE (4, 240)-(635, 240), 9 IF check = 11 THEN wrap(c) = 1 IF control(c) = 0 AND pilot(c) = 0 THEN IF check = 10 THEN IF x(c) < 320 THEN pilot(c) = 1 ELSE pl = c: GOSUB TakeControl END IF NEXT RETURN DrawPlayers: FOR c = 1 TO p IF alive(c) THEN IF power(c) = 0 AND alive(c) = 1 AND wrap(c) = 0 AND pilot(c) = 0 THEN PSET (x(c), y(c)), c ELSE PSET (x(c), y(c)), INT(RND * 8) + 1 END IF NEXT RETURN KillPlayer: alive(dp) = alive(dp) - 1 IF alive(dp) = 0 THEN left = 0 FOR c = 1 TO p IF alive(c) = 1 THEN score(c) = score(c) + 1: left = left + 1 NEXT IF left < 2 AND left <> p THEN GOTO Restart END IF RETURN DATA "`","1","2","3","u","i","e","r","[","]","b","n",".","/","\","z" LimitSpeed: DEF SEG = 0 FOR a = 1 TO 150 Status% = PEEK(&H417) POKE &H417, 32 NEXT RETURN TakeControl: ld = -1 FOR c = 1 TO 8 IF c <> pl AND alive(c) THEN distance(c) = SQR((x(pl) - x(c)) ^ 2 + (y(pl) - y(c)) ^ 2) IF distance(c) > ld THEN ld = distance(c) END IF NEXT IF ld = -1 THEN RETURN FOR c = 1 TO 8 IF ld = distance(c) THEN control(pl) = c NEXT RETURN