DECLARE SUB AI (p1XCoor!, p1YCoor!, p1Angle!, p1Attack!, p1AttackAreaX!, p1AttackAreaY!, p2XCoor!, p2YCoor!, p2Angle!, p2Attack!, p2AttackAreaX!, p2AttackAreaY!, p1Distance!, p1MoveSpeed!, p1TurnSpeed!, p1Damage!, p1Range!, p1Health!, p2Distance!, _ p2MoveSpeed!, p2TurnSpeed!, p2Damage!, p2Range!, p2Health!, powerUp!, powerUpType!, powerUpX!, powerUpY!, p2TurnLeft!, p2TurnRight!, powerUpFlag!) DECLARE SUB healthBar (x!, y!, barColor!, health!) DECLARE SUB drawBackground (outlineColor!, bgColor!) DECLARE SUB graphicsEngine (graphic!(), graphicWidth!, graphicHeight!, xCoor!, yCoor!, negAngle!) DECLARE FUNCTION keyCheck! (keyCode!) DECLARE SUB graphicsLoader (graphic!()) DECLARE SUB particle (particleX!, particleY!, particleLength!, particleColor!) DEFSNG A-Z DIM player1Vehicle(5, 7) DIM player2Vehicle(5, 7) DIM powerUpSpeed(4, 4) DIM powerUpTurn(4, 4) DIM powerUpDamage(4, 4) DIM powerUpRange(4, 4) DIM powerUpHealth(4, 4) RANDOMIZE TIMER CONST pi = 3.141592652589793# CONST true = 1 CONST false = 0 LET outlineColor = 15 LET bgColor = 8 LET collisionParticleLength = 50 LET damageParticleLength = 10 LET powerUpParticleColor = 4 LET powerUpParticleLength = 40 LET powerUpFrequency = 100 LET powerUpSpeedValue = 1 LET powerUpTurnValue = 1 LET powerUpDamageValue = 1 LET powerUpRangeValue = 3 LET powerUpHealthValue = 20 LET p1HealthBarX = 10 LET p1HealthBarY = 190 LET p2HealthBarX = 304 LET p2HealthBarY = 190 LET p1LeftKey = 16 LET p1RightKey = 18 LET p1AttackKey = 17 LET p2LeftKey = 23 LET p2RightKey = 25 LET p2AttackKey = 24 LET p1Distance = 50 LET p2Distance = 50 LET givenRange = 3 LET possiblePoints = 29 SCREEN 7, 0, 0, 0 DO WHILE players <> 1 AND players <> 2 INPUT "1 or 2 players"; players LOOP CALL graphicsLoader(player1Vehicle()) CALL graphicsLoader(player2Vehicle()) CALL graphicsLoader(powerUpSpeed()) CALL graphicsLoader(powerUpTurn()) CALL graphicsLoader(powerUpDamage()) CALL graphicsLoader(powerUpRange()) CALL graphicsLoader(powerUpHealth()) DO SCREEN 7, 0, 0, 0 COLOR 2 LET pointsLeft = possiblePoints DO WHILE pointsLeft <> 0 LET pointsLeft = possiblePoints FOR i = 1 TO 5 CLS PRINT "Player 1, you have"; possiblePoints; "points to" PRINT "distribute between your movement" PRINT "speed, turning speed, damage," PRINT "attack range, and health." PRINT PRINT pointsLeft; "Points left." PRINT IF i = 1 THEN INPUT "Movement speed"; p1InputedMoveSpeed LET p1MoveSpeed = ABS(p1InputedMoveSpeed) LET pointsLeft = pointsLeft - p1InputedMoveSpeed ELSEIF i = 2 THEN INPUT "Turning speed"; p1InputedTurnSpeed LET p1TurnSpeed = ABS(p1InputedTurnSpeed) LET pointsLeft = pointsLeft - p1InputedTurnSpeed ELSEIF i = 3 THEN INPUT "Damage"; p1InputedDamage LET p1Damage = ABS(p1InputedDamage) LET pointsLeft = pointsLeft - p1InputedDamage ELSEIF i = 4 THEN INPUT "Attack Range"; p1InputedRange LET p1Range = ABS(p1InputedRange) LET pointsLeft = pointsLeft - p1InputedRange ELSEIF i = 5 THEN INPUT "Health (x10)"; p1InputedHealth LET p1Health = ABS(p1InputedHealth) LET pointsLeft = pointsLeft - p1InputedHealth END IF NEXT i LOOP COLOR 14 LET pointsLeft = possiblePoints DO WHILE pointsLeft <> 0 AND players = 2 LET pointsLeft = possiblePoints FOR i = 1 TO 5 CLS PRINT "Player 2, you have"; possiblePoints; "points to" PRINT "distribute between your movement" PRINT "speed, turning speed, damage," PRINT "attack range, and health." PRINT PRINT pointsLeft; "Points left." PRINT IF i = 1 THEN INPUT "Movement speed"; p2InputedMoveSpeed LET p2MoveSpeed = ABS(p2InputedMoveSpeed) LET pointsLeft = pointsLeft - p2InputedMoveSpeed ELSEIF i = 2 THEN INPUT "Turning speed"; p2InputedTurnSpeed LET p2TurnSpeed = ABS(p2InputedTurnSpeed) LET pointsLeft = pointsLeft - p2InputedTurnSpeed ELSEIF i = 3 THEN INPUT "Damage"; p2InputedDamage LET p2Damage = ABS(p2InputedDamage) LET pointsLeft = pointsLeft - p2InputedDamage ELSEIF i = 4 THEN INPUT "Attack Range"; p2InputedRange LET p2Range = ABS(p2InputedRange) LET pointsLeft = pointsLeft - p2InputedRange ELSEIF i = 5 THEN INPUT "Health (x10)"; p2InputedHealth LET p2Health = ABS(p2InputedHealth) LET pointsLeft = pointsLeft - p2InputedHealth END IF NEXT i LOOP IF players = 1 THEN LET p2InputedMoveSpeed = INT(RND * 4 + 1) LET p2InputedTurnSpeed = INT(RND * 8 + 1) LET p2InputedDamage = INT(RND * 4 + 1) LET p2InputedRange = INT(RND * 10 + 1) LET p2InputedHealth = possiblePoints - (p2InputedMoveSpeed + p2InputedTurnSpeed + p2InputedDamage + p2InputedRange + p2InputedHealth) END IF DO SCREEN 7, 0, 1, 0 COLOR 15 LET p1Attack = false LET p1TurnLeft = false LET p1TurnRight = false LET p2Attack = false LET p2TurnLeft = false LET p2TurnRight = false LET p1MoveSpeed = p1InputedMoveSpeed LET p1TurnSpeed = p1InputedTurnSpeed LET p1Damage = p1InputedDamage LET p1Range = p1InputedRange LET p1Health = p1InputedHealth * 10 LET p2MoveSpeed = p2InputedMoveSpeed LET p2TurnSpeed = p2InputedTurnSpeed LET p2Damage = p2InputedDamage LET p2Range = p2InputedRange LET p2Health = p2InputedHealth * 10 LET p1Angle = INT(p1TurnSpeed * (INT(RND * (360 / p1TurnSpeed)))) LET p2Angle = INT(p2TurnSpeed * (INT(RND * (360 / p2TurnSpeed)))) LET p1XCoor = 50 LET p1YCoor = 100 LET p2XCoor = 270 LET p2YCoor = 100 CLS COLOR 4 PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT PRINT " On your mark!" CALL drawBackground(outlineColor, bgColor) CALL healthBar(p1HealthBarX, p1HealthBarY, 2, p1Health) CALL healthBar(p2HealthBarX, p2HealthBarY, 14, p2Health) CALL graphicsEngine(player1Vehicle(), 5, 7, p1XCoor, p1YCoor, p1Angle) CALL graphicsEngine(player2Vehicle(), 5, 7, p2XCoor, p2YCoor, p2Angle) PCOPY 1, 0 LET elapsedTime = TIMER DO WHILE elapsedTime >= TIMER - 1 LOOP COLOR 14 PRINT PRINT " Get set!" CALL drawBackground(outlineColor, bgColor) CALL healthBar(p1HealthBarX, p1HealthBarY, 2, p1Health) CALL healthBar(p2HealthBarX, p2HealthBarY, 14, p2Health) CALL graphicsEngine(player1Vehicle(), 5, 7, p1XCoor, p1YCoor, p1Angle) CALL graphicsEngine(player2Vehicle(), 5, 7, p2XCoor, p2YCoor, p2Angle) PCOPY 1, 0 LET elapsedTime = TIMER DO WHILE elapsedTime >= TIMER - 1 LOOP COLOR 2 PRINT PRINT " Go!" CALL drawBackground(outlineColor, bgColor) CALL healthBar(p1HealthBarX, p1HealthBarY, 2, p1Health) CALL healthBar(p2HealthBarX, p2HealthBarY, 14, p2Health) CALL graphicsEngine(player1Vehicle(), 5, 7, p1XCoor, p1YCoor, p1Angle) CALL graphicsEngine(player2Vehicle(), 5, 7, p2XCoor, p2YCoor, p2Angle) PCOPY 1, 0 LET elapsedTime = TIMER DO WHILE elapsedTime >= TIMER - 1 LOOP LET elapsedTime = 0 DO WHILE p1Health >= 0 AND p2Health >= 0 DO WHILE TIMER - elapsedTime < 1 / 60 LOOP LET elapsedTime = TIMER CLS LET unused$ = INKEY$ IF keyCheck(p1LeftKey) = true THEN LET p1TurnLeft = true IF keyCheck(p1RightKey) = true THEN LET p1TurnRight = true IF keyCheck(p1AttackKey) = true THEN LET p1Attack = true IF keyCheck(p1LeftKey) = false THEN LET p1TurnLeft = false IF keyCheck(p1RightKey) = false THEN LET p1TurnRight = false IF keyCheck(p1AttackKey) = false THEN LET p1Attack = false IF players = 2 THEN IF keyCheck(p2LeftKey) = true THEN LET p2TurnLeft = true IF keyCheck(p2RightKey) = true THEN LET p2TurnRight = true IF keyCheck(p2AttackKey) = true THEN LET p2Attack = true IF keyCheck(p2LeftKey) = false THEN LET p2TurnLeft = false IF keyCheck(p2RightKey) = false THEN LET p2TurnRight = false IF keyCheck(p2AttackKey) = false THEN LET p2Attack = false ELSEIF players = 1 THEN CALL AI(p1XCoor, p1YCoor, p1Angle, p1Attack, p1AttackAreaX, p1AttackAreaY, p2XCoor, p2YCoor, p2Angle, p2Attack, p2AttackAreaX, p2AttackAreaY, p1Distance, p1MoveSpeed, p1TurnSpeed, p1Damage, p1Range, p1Health, p2Distance, p2MoveSpeed, p2TurnSpeed, _ p2Damage, p2Range, p2Health, powerUp, powerUpType, powerUpX, powerUpY, p2TurnLeft, p2TurnRight, powerUpFlag) END IF IF p1TurnLeft = true THEN LET p1Angle = p1Angle + p1TurnSpeed END IF IF p1TurnRight = true THEN LET p1Angle = p1Angle - p1TurnSpeed END IF IF p2TurnLeft = true THEN LET p2Angle = p2Angle + p2TurnSpeed END IF IF p2TurnRight = true THEN LET p2Angle = p2Angle - p2TurnSpeed END IF IF p1XCoor <= 0 OR p1XCoor >= 319 OR p1YCoor <= 0 OR p1YCoor >= 199 THEN LET p1Angle = p1Angle + 180 END IF IF p2XCoor <= 0 OR p2XCoor >= 319 OR p2YCoor <= 0 OR p2YCoor >= 199 THEN LET p2Angle = p2Angle + 180 END IF IF p1Angle >= 360 THEN LET p1Angle = p1Angle - 360 ELSEIF p1Angle < 0 THEN LET p1Angle = p1Angle + 360 END IF IF p2Angle >= 360 THEN LET p2Angle = p2Angle - 360 ELSEIF p2Angle < 0 THEN LET p2Angle = p2Angle + 360 END IF LET p1XCoor = p1XCoor + (p1MoveSpeed * COS((-p1Angle - 90) * (pi / 180))) LET p1YCoor = p1YCoor + (p1MoveSpeed * SIN((-p1Angle - 90) * (pi / 180))) LET p2XCoor = p2XCoor + (p2MoveSpeed * COS((-p2Angle - 90) * (pi / 180))) LET p2YCoor = p2YCoor + (p2MoveSpeed * SIN((-p2Angle - 90) * (pi / 180))) CALL drawBackground(outlineColor, bgColor) IF p1XCoor >= p2XCoor - 6 AND p1XCoor <= p2XCoor + 6 AND p1YCoor >= p2YCoor - 6 AND p1YCoor <= p2YCoor + 6 THEN LET p1Health = p1Health / 2 LET p2Health = p2Health / 2 CALL particle(p1XCoor, p1YCoor, collisionParticleLength, 2) CALL particle(p1XCoor, p1YCoor, collisionParticleLength, 2) CALL particle(p2XCoor, p2YCoor, collisionParticleLength, 14) CALL particle(p2XCoor, p2YCoor, collisionParticleLength, 14) END IF CALL healthBar(p1HealthBarX, p1HealthBarY, 2, p1Health) CALL healthBar(p2HealthBarX, p2HealthBarY, 14, p2Health) IF powerUp = false THEN IF INT(RND * powerUpFrequency) = true THEN LET powerUpX = RND * 300 + 10 LET powerUpY = RND * 180 + 10 LET powerUpType = INT(RND * 5) + 1 LET powerUp = true CALL particle(powerUpX, powerUpY, powerUpParticleLength, powerUpParticleColor) CALL particle(powerUpX, powerUpY, powerUpParticleLength, powerUpParticleColor) CALL particle(powerUpX, powerUpY, powerUpParticleLength, powerUpParticleColor) END IF ELSEIF powerUp = true THEN SELECT CASE powerUpType CASE IS = 1 CALL graphicsEngine(powerUpSpeed(), 4, 4, powerUpX, powerUpY, 0) IF p1XCoor >= powerUpX - 5 AND p1XCoor <= powerUpX + 5 AND p1YCoor >= powerUpY - 5 AND p1YCoor <= powerUpY + 5 THEN LET p1MoveSpeed = p1MoveSpeed + powerUpSpeedValue LET powerUp = false ELSEIF p2XCoor >= powerUpX - 5 AND p2XCoor <= powerUpX + 5 AND p2YCoor >= powerUpY - 5 AND p2YCoor <= powerUpY + 5 THEN LET p2MoveSpeed = p2MoveSpeed + powerUpSpeedValue LET powerUp = false END IF CASE IS = 2 CALL graphicsEngine(powerUpTurn(), 4, 4, powerUpX, powerUpY, 0) IF p1XCoor >= powerUpX - 5 AND p1XCoor <= powerUpX + 5 AND p1YCoor >= powerUpY - 5 AND p1YCoor <= powerUpY + 5 THEN LET p1TurnSpeed = p1TurnSpeed + powerUpTurnValue LET powerUp = false ELSEIF p2XCoor >= powerUpX - 5 AND p2XCoor <= powerUpX + 5 AND p2YCoor >= powerUpY - 5 AND p2YCoor <= powerUpY + 5 THEN LET p2TurnSpeed = p2TurnSpeed + powerUpTurnValue LET powerUp = false END IF CASE IS = 3 CALL graphicsEngine(powerUpDamage(), 4, 4, powerUpX, powerUpY, 0) IF p1XCoor >= powerUpX - 5 AND p1XCoor <= powerUpX + 5 AND p1YCoor >= powerUpY - 5 AND p1YCoor <= powerUpY + 5 THEN LET p1Damage = p1Damage + powerUpDamageValue LET powerUp = false ELSEIF p2XCoor >= powerUpX - 5 AND p2XCoor <= powerUpX + 5 AND p2YCoor >= powerUpY - 5 AND p2YCoor <= powerUpY + 5 THEN LET p2Damage = p2Damage + powerUpDamageValue LET powerUp = false END IF CASE IS = 4 CALL graphicsEngine(powerUpRange(), 4, 4, powerUpX, powerUpY, 0) IF p1XCoor >= powerUpX - 5 AND p1XCoor <= powerUpX + 5 AND p1YCoor >= powerUpY - 5 AND p1YCoor <= powerUpY + 5 THEN LET p1Range = p1Range + powerUpRangeValue LET powerUp = false ELSEIF p2XCoor >= powerUpX - 5 AND p2XCoor <= powerUpX + 5 AND p2YCoor >= powerUpY - 5 AND p2YCoor <= powerUpY + 5 THEN LET p2Range = p2Range + powerUpRangeValue LET powerUp = false END IF CASE IS = 5 CALL graphicsEngine(powerUpHealth(), 4, 4, powerUpX, powerUpY, 0) IF p1XCoor >= powerUpX - 5 AND p1XCoor <= powerUpX + 5 AND p1YCoor >= powerUpY - 5 AND p1YCoor <= powerUpY + 5 THEN LET p1Health = p1Health + powerUpHealthValue LET powerUp = false ELSEIF p2XCoor >= powerUpX - 5 AND p2XCoor <= powerUpX + 5 AND p2YCoor >= powerUpY - 5 AND p2YCoor <= powerUpY + 5 THEN LET p2Health = p2Health + powerUpHealthValue LET powerUp = false END IF END SELECT END IF IF p1Attack = true THEN LET p1AttackAreaX = p1XCoor + (p1Distance * COS((-p1Angle - 90) * (pi / 180))) LET p1AttackAreaY = p1YCoor + (p1Distance * SIN((-p1Angle - 90) * (pi / 180))) CIRCLE (p1AttackAreaX, p1AttackAreaY), p1Range + givenRange, 2 IF SQR((p1AttackAreaX - p2XCoor) ^ 2 + (p1AttackAreaY - p2YCoor) ^ 2) <= p1Range + givenRange THEN LET p2Health = p2Health - p1Damage CALL particle(p2XCoor, p2YCoor, p1Damage * damageParticleLength, 14) END IF END IF IF p2Attack = true THEN LET p2AttackAreaX = p2XCoor + (p2Distance * COS((-p2Angle - 90) * (pi / 180))) LET p2AttackAreaY = p2YCoor + (p2Distance * SIN((-p2Angle - 90) * (pi / 180))) CIRCLE (p2AttackAreaX, p2AttackAreaY), p2Range + givenRange, 14 IF SQR((p2AttackAreaX - p1XCoor) ^ 2 + (p2AttackAreaY - p1YCoor) ^ 2) <= p2Range + givenRange THEN LET p1Health = p1Health - p2Damage CALL particle(p1XCoor, p1YCoor, p2Damage * damageParticleLength, 2) END IF END IF CALL graphicsEngine(player1Vehicle(), 5, 7, p1XCoor, p1YCoor, p1Angle) CALL graphicsEngine(player2Vehicle(), 5, 7, p2XCoor, p2YCoor, p2Angle) PCOPY 1, 0 LOOP CLS PRINT IF p1Health >= 0 THEN COLOR 2 PRINT " Player 1 is the winner!" PRINT PRINT " C - Continue with the current setups." PRINT " N - Create new setups." PRINT " X - Exit the game." CALL drawBackground(outlineColor, bgColor) CALL healthBar(p1HealthBarX, p1HealthBarY, 2, p1Health) CALL graphicsEngine(player1Vehicle(), 5, 7, p1XCoor, p1YCoor, p1Angle) ELSEIF p2Health >= 0 THEN COLOR 14 PRINT " Player 2 is the winner!" PRINT PRINT " C - Continue with the current setups." PRINT " N - Create new setups." PRINT " X - Exit the game." CALL drawBackground(outlineColor, bgColor) CALL healthBar(p2HealthBarX, p2HealthBarY, 14, p2Health) CALL graphicsEngine(player2Vehicle(), 5, 7, p2XCoor, p2YCoor, p2Angle) ELSEIF p1Health < 0 AND p2Health < 0 THEN COLOR 15 PRINT " A draw?!" PRINT PRINT " C - Continue with the current setups." PRINT " N - Create new setups." PRINT " X - Exit the game." CALL drawBackground(outlineColor, bgColor) END IF PCOPY 1, 0 LET KEY$ = "" DO WHILE KEY$ <> "c" AND KEY$ <> "n" AND KEY$ <> "x" LET KEY$ = INKEY$ LOOP LOOP WHILE KEY$ = "c" LOOP WHILE KEY$ = "n" END 'player 1 vehicle DATA 5,7 DATA -1,-1,02,-1,-1 DATA -1,02,07,02,-1 DATA -1,02,07,02,-1 DATA 02,07,07,07,02 DATA 02,07,07,07,02 DATA 02,02,02,02,02 DATA -1,02,02,02,-1 'player 2 vehicle DATA 5,7 DATA -1,-1,14,-1,-1 DATA -1,14,07,14,-1 DATA -1,14,07,14,-1 DATA 14,07,07,07,14 DATA 14,07,07,07,14 DATA 14,14,14,14,14 DATA -1,14,14,14,-1 'Speed power up DATA 4,4 DATA 03,03,-1,-1 DATA -1,-1,03,03 DATA 03,03,-1,-1 DATA -1,-1,03,03 'Turn power up DATA 4,4 DATA -1,01,01,-1 DATA 01,-1,-1,01 DATA 01,-1,-1,-1 DATA -1,01,01,01 'Damage power up DATA 4,4 DATA 04,-1,04,-1 DATA -1,04,04,04 DATA 04,04,04,-1 DATA -1,04,-1,04 'Range power up DATA 4,4 DATA -1,-1,05,05 DATA -1,05,05,05 DATA 05,05,05,-1 DATA 05,05,-1,-1 'Health power up DATA 4,4 DATA -1,04,04,-1 DATA 04,15,15,04 DATA 04,15,15,04 DATA -1,04,04,-1 SUB AI (p1XCoor, p1YCoor, p1Angle, p1Attack, p1AttackAreaX, p1AttackAreaY, p2XCoor, p2YCoor, p2Angle, p2Attack, p2AttackAreaX, p2AttackAreaY, p1Distance, p1MoveSpeed, p1TurnSpeed, p1Damage, p1Range, p1Health, p2Distance, p2MoveSpeed, p2TurnSpeed, _ p2Damage, p2Range, p2Health, powerUp, powerUpType, powerUpX, powerUpY, p2TurnLeft, p2TurnRight, powerUpFlag) LET p2TurnLeft = false LET p2TurnRight = false LET p2Attack = false LET powerUpFlag = false LET attackDistance = SQR((p2XCoor - p1AttackAreaX) ^ 2 + (p2YCoor - p1AttackAreaY) ^ 2) IF p2XCoor <> p1XCoor THEN LET playerAngle = ATN((p2YCoor - p1YCoor) / (p2XCoor - p1XCoor)) IF p2XCoor < p1XCoor THEN LET playerAngle = playerAngle + pi END IF ELSEIF p2YCoor > p1YCoor THEN LET playerAngle = pi / 2 ELSE LET playerAngle = 3 * pi / 2 END IF IF playerAngle < 0 THEN LET playerAngle = 2 * pi + playerAngle END IF LET playerAngle = playerAngle - pi / 2 IF p2YCoor > p1YCoor THEN LET playerAngle = -playerAngle ELSEIF p2YCoor < p1YCoor THEN LET playerAngle = -playerAngle + 2 * pi END IF IF playerAngle >= 2 * pi THEN LET playerAngle = playerAngle - 2 * pi ELSEIF playerAngle < 0 THEN LET playerAngle = playerAngle + 2 * pi END IF IF p2XCoor <> powerUpX THEN LET powerUpAngle = ATN((p2YCoor - powerUpY) / (p2XCoor - powerUpX)) IF p2XCoor < powerUpX THEN LET powerUpAngle = powerUpAngle + pi END IF ELSEIF p2YCoor > powerUpY THEN LET powerUpAngle = pi / 2 ELSE LET powerUpAngle = 3 * pi / 2 END IF IF powerUpAngle < 0 THEN LET powerUpAngle = 2 * pi + powerUpAngle END IF LET powerUpAngle = powerUpAngle - pi / 2 IF p2YCoor > powerUpY THEN LET powerUpAngle = -powerUpAngle ELSEIF p2YCoor < powerUpY THEN LET powerUpAngle = -powerUpAngle + 2 * pi END IF IF powerUpAngle >= 2 * pi THEN LET powerUpAngle = powerUpAngle - 2 * pi ELSEIF powerUpAngle < 0 THEN LET powerUpAngle = powerUpAngle + 2 * pi END IF IF powerUp = true AND p1Range <= attackDistance THEN IF p2Angle * (pi / 180) > powerUpAngle THEN LET p2TurnRight = true ELSEIF p2Angle * (pi / 180) < powerUpAngle THEN LET p2TurnLeft = true END IF LET powerUpFlag = true ELSE LET powerUpFlag = false IF attackDistance <= p1Range AND p1Attack = true THEN LET p2Attack = false IF p2Angle * (pi / 180) > pi - playerAngle THEN LET p2TurnRight = true ELSEIF p2Angle * (pi / 180) < pi - playerAngle THEN LET p2TurnLeft = true END IF ELSEIF attackDistance > p1Range OR p1Attack = false THEN LET p2Attack = true IF p2Angle * (pi / 180) > playerAngle THEN LET p2TurnRight = true ELSEIF p2Angle * (pi / 180) < playerAngle THEN LET p2TurnLeft = true END IF END IF END IF END SUB SUB drawBackground (outlineColor, bgColor) FOR x = 0 TO 320 STEP 20 LINE (x, 0)-(x, 200), bgColor NEXT x FOR y = 0 TO 200 STEP 20 LINE (0, y)-(320, y), bgColor NEXT y LINE (0, 0)-(319, 0), outlineColor LINE (0, 0)-(0, 199), outlineColor LINE (319, 199)-(0, 199), outlineColor LINE (319, 199)-(319, 0), outlineColor END SUB SUB graphicsEngine (graphic(), graphicWidth, graphicHeight, xCoor, yCoor, negAngle) LET angle = -negAngle LET radians = angle * (pi / 180) LET shiftDistance = SQR((xCoor - (xCoor + (graphicWidth / 2))) ^ 2 + (yCoor - (yCoor + (graphicHeight / 2))) ^ 2) LET shiftRadians = pi + ATN((((graphicHeight / 2) + yCoor) - yCoor) / (((graphicWidth / 2) + xCoor) - xCoor)) LET shiftXCoor = xCoor + shiftDistance * COS(radians + (shiftRadians)) LET shiftYCoor = yCoor + shiftDistance * SIN(radians + (shiftRadians)) FOR y = shiftYCoor + 1 TO shiftYCoor + graphicHeight FOR x = shiftXCoor + 1 TO shiftXCoor + graphicWidth IF graphic(x - shiftXCoor, y - shiftYCoor) <> -1 THEN LET distance = SQR((x - shiftXCoor) ^ 2 + (y - shiftYCoor) ^ 2) LET tRadians = radians + ATN(((y - shiftYCoor) * (pi / 180)) / ((x - shiftXCoor) * (pi / 180))) PSET (INT(.5 + (shiftXCoor + (distance * COS(tRadians)))), INT(.5 + shiftYCoor + (distance * SIN(tRadians)))), graphic(x - shiftXCoor, y - shiftYCoor) END IF NEXT x NEXT y END SUB SUB graphicsLoader (graphic()) READ graphicWidth READ graphicHeight FOR y = 1 TO graphicHeight FOR x = 1 TO graphicWidth READ graphic(x, y) NEXT x NEXT y END SUB SUB healthBar (x, y, barColor, health) LINE (x, y)-(x + 5, y - (health / 2)), barColor, BF END SUB FUNCTION keyCheck (keyCode) IF MULTIKEY(KeyCode) = -1 THEN keyCheck = true ELSE keyCheck = false END IF END FUNCTION SUB particle (particleX, particleY, particleLength, particleColor) LINE (particleX, particleY)-(particleX + (RND * particleLength * COS(RND * 2 * pi)), particleY + (RND * particleLength * SIN(RND * 2 * pi))), particleColor LINE (particleX, particleY)-(particleX + (RND * particleLength * COS(RND * 2 * pi)), particleY + (RND * particleLength * SIN(RND * 2 * pi))), particleColor LINE (particleX, particleY)-(particleX + (RND * particleLength * COS(RND * 2 * pi)), particleY + (RND * particleLength * SIN(RND * 2 * pi))), particleColor END SUB