DECLARE SUB drawSprite (sprite%(), xSize!, ySize!, x!, y!) DECLARE SUB shootTarget (level!(), shootDir!, playerTurn!, playerPos!(), activeUnit!, playerHealth!()) DECLARE SUB findBlock (level!(), shootDir!, stepDir!, startI!, endI!, startJ!) DECLARE SUB createLevel (level!()) DECLARE SUB drawLevel (level!(), tile%(), xSize, ySize) DECLARE SUB redraw (doRedraw!) SCREEN 7 CLS unitWidth = 9 unitHeight = 9 DATA 15,15,15,15,15,15,15,15,15,15 DATA 15, 5, 5, 5, 5,15, 5, 5, 5, 5 DATA 15, 5, 5, 5, 5,15, 5, 5, 5, 5 DATA 15,15,15,15,15,15,15,15,15,15 DATA 5, 5, 5,15, 5, 5, 5, 5,15, 5 DATA 5, 5, 5,15, 5, 5, 5, 5,15, 5 DATA 15,15,15,15,15,15,15,15,15,15 DATA 15, 5, 5, 5, 5,15, 5, 5, 5, 5 DATA 15, 5, 5, 5, 5,15, 5, 5, 5, 5 DATA 15,15,15,15,15,15,15,15,15,15 DIM tile%(unitWidth, unitHeight) FOR y% = 0 TO unitHeight FOR x% = 0 TO unitWidth READ tile%(x%, y%) NEXT x% NEXT y% DATA 0,0,0,2,2,2,2,0,0,0 DATA 0,0,2,6,6,6,6,2,0,0 DATA 0,0,6,0,6,6,0,6,0,0 DATA 0,0,6,6,6,6,6,6,0,0 DATA 0,0,6,0,0,0,0,6,0,0 DATA 0,0,0,6,6,6,6,0,7,7 DATA 0,2,2,2,2,2,2,2,7,0 DATA 0,0,0,0,2,2,0,0,0,0 DATA 0,0,0,2,2,2,2,0,0,0 DATA 0,0,2,2,0,0,2,2,0,0 DIM unit%(unitWidth, unitHeight) FOR y% = 0 TO unitHeight FOR x% = 0 TO unitWidth READ unit%(x%, y%) NEXT x% NEXT y% DATA 0,0,4,0,0,0,0,0,0,0 DATA 0,0,0,0,0,0,0,0,4,0 DATA 4,4,0,2,4,4,2,4,4,4 DATA 0,4,4,6,4,6,4,0,4,0 DATA 0,0,4,4,6,4,0,4,0,0 DATA 0,0,2,4,4,2,2,2,0,0 DATA 0,2,4,4,4,4,2,2,4,4 DATA 4,0,4,0,4,2,0,4,0,0 DATA 0,4,4,2,4,2,4,0,4,0 DATA 0,0,4,2,0,0,2,4,0,0 DIM deadUnit%(unitWidth, unitHeight) FOR y% = 0 TO unitHeight FOR x% = 0 TO unitWidth READ deadUnit%(x%, y%) NEXT x% NEXT y% DIM keyPress$ DIM playerPos(4, 2) playerPos(0, 0) = 14 playerPos(0, 1) = 8 playerPos(1, 0) = 18 playerPos(1, 1) = 8 playerPos(2, 0) = 14 playerPos(2, 1) = 12 playerPos(3, 0) = 18 playerPos(3, 1) = 12 DIM playyerHealth(4) playerHealth(0) = 1 playerHealth(1) = 1 playerHealth(2) = 1 playerHealth(3) = 1 DIM playerColor(4) playerColor(0) = 2 playerColor(1) = 4 playerColor(2) = 2 playerColor(3) = 4 playerTurn = 0 activeUnit = 0 gridWidth = 10 movesPerTurn = 4 moveCounter = 0 changeTurn = 0 requireRedraw = 1 shootDir = 3 shoot = 0 REM $STATIC DIM level(32, 20) createLevel level() DO px = playerPos(playerTurn + activeUnit, 0) py = playerPos(playerTurn + activeUnit, 1) keyPress$ = UCASE$(INKEY$) IF gameOver <> 0 AND keyPress$ > CHR$(0) THEN END END IF IF keyPress$ = CHR$(0) + CHR$(72) AND py > 1 THEN ly = py - 1 IF changeTurn = 0 AND level(px, ly) <> 1 THEN py = py - 1 moveCounter = moveCounter + 1 shootDir = 1 changeTurn = 0 shoot = 0 requireRedraw = 1 END IF ELSEIF keyPress$ = CHR$(0) + CHR$(80) THEN ly = py + 1 IF changeTurn = 0 AND py < 18 AND level(px, ly) <> 1 THEN py = py + 1 moveCounter = moveCounter + 1 shootDir = 3 changeTurn = 0 shoot = 0 requireRedraw = 1 END IF ELSEIF keyPress$ = CHR$(0) + CHR$(75) AND px > 6 THEN lx = px - 1 IF changeTurn = 0 AND level(lx, py) <> 1 THEN px = px - 1 moveCounter = moveCounter + 1 shootDir = 4 changeTurn = 0 shoot = 0 requireRedraw = 1 END IF ELSEIF keyPress$ = CHR$(0) + CHR$(77) AND px < 26 THEN lx = px + 1 IF changeTurn = 0 AND level(lx, py) <> 1 THEN px = px + 1 moveCounter = moveCounter + 1 shootDir = 2 changeTurn = 0 shoot = 0 requireRedraw = 1 END IF END IF playerPos(playerTurn + activeUnit, 0) = px playerPos(playerTurn + activeUnit, 1) = py IF keyPress$ = CHR$(32) THEN IF changeTurn = 0 THEN moveCounter = movesPerTurn shoot = 1 ELSE changeTurn = 0 shoot = 0 IF playerHealth(playerTurn) = 0 THEN activeUnit = 2 ELSE activeUnit = 0 END IF END IF requireRedraw = 1 ELSEIF keyPress$ = "1" THEN IF playerHealth(playerTurn) = 0 THEN activeUnit = 2 ELSE activeUnit = 0 END IF requireRedraw = 1 ELSEIF keyPress$ = "2" THEN IF playerHealth(playerTurn + 2) = 0 THEN activeUnit = 0 ELSE activeUnit = 2 END IF requireRedraw = 1 END IF IF requireRedraw = 1 THEN CLS gameOver = 0 IF shoot = 1 THEN shootTarget level(), shootDir, playerTurn, playerPos(), activeUnit, playerHealth() END IF FOR player = 0 TO 3 plx = playerPos(player, 0) * gridWidth + offset ply = playerPos(player, 1) * gridWidth IF playerHealth(player) <> 0 THEN drawSprite unit%(), unitWidth, unitHeight, plx, ply ELSE drawSprite deadUnit%(), unitWidth, unitHeight, plx, ply END IF NEXT player drawLevel level(), tile%(), unitWidth, unitHeight requireRedraw = 0 END IF IF playerHealth(0) = 0 AND playerHealth(2) = 0 THEN gameOver = 2 ELSEIF playerHealth(1) = 0 AND playerHealth(3) = 0 THEN gameOver = 1 END IF IF moveCounter = movesPerTurn AND gameOver = 0 THEN changeTurn = 1 LOCATE 12, 16 PRINT "Change turn" LOCATE 13, 15 PRINT "(Press space)" moveCounter = 0 IF playerTurn = 0 THEN playerTurn = 1 ELSE playerTurn = 0 END IF ELSEIF gameOver <> 0 THEN LOCATE 12, 17 PRINT "Game over. " LOCATE 14, 14 PRINT "Player "; gameOver; " wins!" END IF LOCATE 1, 1 PRINT "player: "; playerTurn + 1 LOCATE 1, 31 PRINT "moves: "; movesPerTurn - moveCounter LOCATE 3, 1 PRINT "Active" LOCATE 4, 1 PRINT "unit:" LOCATE 6, 1 IF activeUnit = 0 THEN COLOR 15 ELSE COLOR 8 END IF PRINT 1 LOCATE 6, 3 IF activeUnit = 2 THEN COLOR 15 ELSE COLOR 8 END IF PRINT 2 COLOR 15 LOOP UNTIL keyPress$ = "Q" OR keyPress$ = CHR$(27) END SUB createLevel (level()) FOR x = 6 TO 26 FOR y = 1 TO 19 IF x = 16 AND y > 4 AND y < 16 THEN level(x, y) = 1 ELSEIF y = 10 AND x > 10 AND x < 22 THEN level(x, y) = 1 ELSE level(x, y) = 0 END IF NEXT y NEXT x level(10, 4) = 1 level(11, 4) = 1 level(10, 5) = 1 level(22, 4) = 1 level(21, 4) = 1 level(22, 5) = 1 level(10, 16) = 1 level(11, 16) = 1 level(10, 15) = 1 level(22, 16) = 1 level(21, 16) = 1 level(22, 15) = 1 END SUB SUB drawLevel (level(), tile%(), xSize, ySize) LINE (6 * 10, 1 * 10)-(27 * 10, 1 * 10), 7 LINE (6 * 10, 1 * 10)-(6 * 10, 19 * 10), 7 LINE (6 * 10, 19 * 10)-(27 * 10, 19 * 10), 7 LINE (27 * 10, 1 * 10)-(27 * 10, 19 * 10), 7 FOR x = 6 TO 26 FOR y = 1 TO 18 IF level(x, y) = 1 THEN xCoord = x * 10 yCoord = y * 10 drawSprite tile%(), xSize, ySize, xCoord, yCoord END IF NEXT y NEXT x END SUB SUB drawSprite (sprite%(), xSize, ySize, x, y) FOR py = 0 TO ySize FOR px = 0 TO xSize PSET (px + x, py + y), sprite%(px, py) NEXT px NEXT py END SUB SUB findBlock (level(), shootDir, stepDir, startI, max, startJ) FOR i = startI TO max STEP stepDir IF shootDir = 1 OR shootDir = 3 THEN y = i x = startJ ELSE x = i y = startJ END IF block = level(x, y) IF block = 1 THEN max = i EXIT FOR END IF NEXT i END SUB SUB redraw (doRedraw) CLS doRedraw = 1 END SUB SUB shootTarget (level(), shootDir, playerTurn, playerPos(), activeUnit, playerHealth()) playerX = playerPos(playerTurn + activeUnit, 0) playerY = playerPos(playerTurn + activeUnit, 1) endX = playerX endY = playerY IF shootDir = 1 THEN endY = 0 findBlock level(), shootDir, -1, playerY, endY, playerX FOR p = 0 TO 4 px = playerPos(p, 0) py = playerPos(p, 1) IF px = endX AND py < playerY AND py >= endY THEN endY = py playerHealth(p) = 0 END IF NEXT p ELSEIF shootDir = 2 THEN endX = 31 findBlock level(), shootDir, 1, playerX, endX, playerY FOR p = 0 TO 4 px = playerPos(p, 0) py = playerPos(p, 1) IF py = endY AND px > playerX AND px <= endX THEN endX = px playerHealth(p) = 0 END IF NEXT p ELSEIF shootDir = 3 THEN endY = 19 findBlock level(), shootDir, 1, playerY, endY, playerX FOR p = 0 TO 4 px = playerPos(p, 0) py = playerPos(p, 1) IF px = endX AND py > playerY AND py <= endY THEN endY = py playerHealth(p) = 0 END IF NEXT p ELSEIF shootDir = 4 THEN endX = 0 findBlock level(), shootDir, -1, playerX, endX, playerY FOR p = 0 TO 4 px = playerPos(p, 0) py = playerPos(p, 1) IF py = endY AND px < playerX AND px >= endX THEN endX = px playerHealth(p) = 0 END IF NEXT p END IF LINE (playerX * 10 + 5, playerY * 10 + 5)-(endX * 10 + 5, endY * 10 + 5), 14 END SUB