DECLARE SUB Adios (StartingKeys%, Reason$)
DECLARE SUB DrawSpaceStation (y%)
DECLARE SUB GetKeysPressed ()
DECLARE FUNCTION IsBulletCol% (AX!, AY!, OX%, OY%)
DECLARE FUNCTION IsAsteroidCol% (AX!, AY!, AX2!, AY2!)
DECLARE FUNCTION IsShipCollision% (SX%, SY%, OX!, OY!, OW%, OH%)
DECLARE SUB EraseImage (x%, y%, w%, h%)
DECLARE SUB DrawAsteroid (x%, y%)
DECLARE SUB DrawCharacter (x%, y%)
DECLARE SUB InitScreen ()
'-------------------------------------------------------------------------
'| Space.BAS by Nathan Belue (ComputerGhost)
'| Started: 10-29-2005 12:07AM
'| Released: 11-30-2005 8:32PM
'-------------------------------------------------------------------------
const HitMax = 3: "Maximum hits you can sustain
DIM SHARED KeysPressed$
DIM SHARED StartingKeys%
DIM AsteroidX(5), AsteroidY(5) 'Position
DIM OAsteroidX(5), OAsteroidY(5) 'Old position
DIM AsteroidXS(5), AsteroidYS(5) 'Speed
DIM BulletX%(10), BulletY%(10) 'Position
REM --Initialize values--
DEF SEG = &H40: StartingKeys% = PEEK(&H17) AND &HF0: DEF SEG
FOR i% = 0 TO 9
BulletY%(i%) = -1
NEXT i%
ShipX% = 40
ShipY% = 43
OShipX% = 40
OShipY% = 43
Distance% = 2400
Points% = 0
'If you can't use Command$ then just comment this out
IF COMMAND$ = "S" THEN
Collision$ = "O0 C32"
Shot$ = "O0 MN C MS CCCC ML"
Shoot$ = "MS O1EGD32 ML"
END IF
REM --Now for the fun part!--
RANDOMIZE TIMER \ 3
PLAY "MB ML L64"
InitScreen
REM --Intro--
FOR y% = 43 TO 50
CALL EraseImage(1, y% - 1, 79, 1)
CALL DrawSpaceStation(y%)
CALL DrawCharacter(ShipX%, ShipY%)
timers = TIMER
DO: n$ = INKEY$: LOOP UNTIL timers + .1 < TIMER
NEXT y%
REM --Main code--
Main:
DO
timers = TIMER
'Bullets
FOR i% = 0 TO 9
REM --Test for collisions--
FOR i2% = 0 TO 4
IF IsBulletCol%(AsteroidX(i2%), AsteroidY(i2%), BulletX%(i%), BulletY%(i%)) THEN
AsteroidY(i2%) = 55
Points% = Points% + 1
IF PLAY(n) = 0 THEN PLAY Shot$
EXIT FOR
END IF
NEXT i2%
REM --Draw the images--
CALL EraseImage(BulletX%(i%), BulletY%(i%) + 1, 1, 1)
IF (BulletY%(i%) > 1) THEN
LOCATE BulletY%(i%), BulletX%(i%)
COLOR 10: PRINT "³"
END IF
REM --Update the positions of the bullets--
BulletY%(i%) = BulletY%(i%) - 1
REM --Test variables--
IF BulletY%(i%) < 0 THEN BulletY% = 0
NEXT i%
'Asteroids
FOR i% = 0 TO 4
REM --Test for collisions--
'with ship
IF IsShipCollision(ShipX%, ShipY%, AsteroidX(i%), AsteroidY(i%), 5, 4) THEN
Hit% = Hit% + 1
AsteroidY(i%) = 55
IF PLAY(1) = 0 THEN PLAY Collision$
END IF
'with another asteroid
FOR i2% = 0 TO 4
IF (i% <> i2%) AND IsAsteroidCol%(AsteroidX(i%), AsteroidY(i%), AsteroidX(i2%), AsteroidY(i2%)) THEN
AsteroidXS(i%) = -AsteroidXS(i%)
AsteroidYS(i%) = -AsteroidYS(i%)
END IF
NEXT i2%
REM --Draw the images--
CALL EraseImage(OAsteroidX(i%) OR 0, OAsteroidY(i%) OR 0, 5, 5)
CALL DrawAsteroid(AsteroidX(i%) OR 0, AsteroidY(i%) OR 0)
REM --Update positions of asteroids--
'Store old values
OAsteroidX(i%) = AsteroidX(i%)
OAsteroidY(i%) = AsteroidY(i%)
'Test variables
IF (AsteroidY(i%) > 44) THEN
AsteroidXS(i%) = 0
AsteroidYS(i%) = 0
AsteroidX(i%) = INT(RND * 76) + .5
AsteroidY(i%) = INT(RND * 50) * 50
IF (AsteroidY(i%) = 0) THEN
AsteroidY(i%) = 1
END IF
END IF
NEXT i%
REM --Status--
'rectangle
LOCATE 1, 1
COLOR 10, 1
FOR i% = 1 TO 5
PRINT STRING$(17, " "); "³"
NEXT i%
PRINT STRING$(17, "Ä"); "Ù"
'status
LOCATE 1, 1
COLOR 15: PRINT " Points:";
COLOR 14: PRINT Points%
COLOR 15: PRINT " Distance:";
COLOR 14: PRINT Distance%
COLOR 15: PRINT " Hits:";
COLOR 14: PRINT Hit%;
COLOR 15: PRINT "of"; HitMax
IF Hit% = HitMax THEN Adios StartingKeys%, "DIE!"
REM --Timer--
DO
CALL GetKeysPressed
LOOP UNTIL timers + .01 < TIMER
Distance% = Distance% - 1
IF Distance% = 0 THEN GOTO Finished
LOOP UNTIL LEN(KeysPressed$)
IF INSTR(KeysPressed$, "H") THEN 'UP
IF (ShipY% > 1) THEN ShipY% = ShipY% - 1
END IF
IF INSTR(KeysPressed$, "P") THEN 'DOWN
IF (ShipY% < 46) THEN ShipY% = ShipY% + 1
END IF
IF INSTR(KeysPressed$, "K") THEN 'LEFT
IF (ShipX% > 1) THEN ShipX% = ShipX% - 1
END IF
IF INSTR(KeysPressed$, "M") THEN 'RIGHT
IF (ShipX% < 74) THEN ShipX% = ShipX% + 1
END IF
IF INSTR(KeysPressed$, "9") THEN 'SPACE BAR
FOR i% = 0 TO 9
IF BulletY%(i%) < 1 THEN
BulletY%(i%) = ShipY% - 1
BulletX%(i%) = ShipX% + 3
IF PLAY(1) = 0 THEN PLAY Shoot$
EXIT FOR
END IF
NEXT i%
END IF
IF INSTR(KeysPressed$, "2") THEN 'M for mute
Collision$ = ""
Shot$ = ""
Shoot$ = ""
END IF
IF INSTR(KeysPressed$, CHR$(1)) THEN 'ESCAPE
Adios StartingKeys%, "decided to quit"
END IF
IF INSTR(KeysPressed$, CHR$(28)) THEN 'ENTER
SLEEP (1)
KeysPressed$ = ""
DO
CALL GetKeysPressed
LOOP UNTIL LEN(KeysPressed$)
SLEEP (1)
END IF
GOTO Main
Finished:
FOR y% = ShipY% TO 1 STEP -1
CALL EraseImage(OShipX%, y% + 1, 7, 4)
CALL DrawCharacter(ShipX%, y%)
timers = TIMER
DO: n$ = INKEY$: LOOP UNTIL timers + .01 < TIMER
NEXT y%
Adios StartingKeys%, " have finished the game."
SUB Adios (StartingKeys%, Reason$)
LOCATE 10, 30: PRINT "Adios, My Friend - You " + Reason$
' User might have stacked a zillion keypresses
IF INKEY$ <> "" THEN
FOR i = 1 TO 100
WHILE INKEY$ <> "": WEND
NEXT i
END IF
WHILE INKEY$ = "": WEND
CLS : WIDTH 80, 25
DEF SEG = &H40: POKE &H17, StartingKeys%: DEF SEG
WHILE INKEY$ <> "": WEND
SYSTEM
END SUB
SUB DrawAsteroid (x%, y%)
'----Asteroid----
'012345
' ÜÜÜ
' ÞÛÛÛÝ
' ÞÛÛÛÝ
' ßßß
'
'----------------
REM --Test (x%, y%) to see if it's valid--
IF (x% > 76) OR (x% < 1) OR (y% < 1) OR (y% > 46) THEN EXIT SUB
REM --Draw the image--
LOCATE y%, x%
COLOR 8, 0: PRINT "Ü";
COLOR 8, 7: PRINT "³ À";
COLOR 8, 0: PRINT "Ü"
LOCATE y% + 1, x%
COLOR 8, 7: PRINT "ÚÏ¸Ú "
LOCATE y% + 2, x%
PRINT "Ä ÃÙÕ"
LOCATE y% + 3, x%
COLOR 8, 0: PRINT "ß";
COLOR 8, 7: PRINT "ÚÙ ";
COLOR 8, 0: PRINT "Ý";
f% = INT(RND * 2) * 2 + 12
LOCATE y%, x% + 2
COLOR 7, 0: PRINT "Þ";
COLOR 15: PRINT "º";
COLOR 7: PRINT "Ý"
LOCATE y% + 1, x% + 2
COLOR 7: PRINT "Û";
COLOR 11: PRINT "þ";
COLOR 7: PRINT "Û"
LOCATE y% + 2, x% + 1
COLOR 7: PRINT "ÜÛÛÛÜ"
LOCATE y% + 3, x%
COLOR 7: PRINT "/";
LOCATE , x% + 3
COLOR f%: PRINT "±";
LOCATE , x% + 6
COLOR 7: PRINT "\";
END SUB
SUB DrawSpaceStation (y%)
IF y% <= 49 THEN
LOCATE y%, 1
COLOR 7, 0
PRINT " ÜÜÜÜÜÜÜÛ";
PRINT "ÛÛÛ ÛÛÛÛÜÜÜÜÜÜÜ ";
END IF
IF y% <= 48 THEN
LOCATE y% + 1, 1
PRINT " ÜÛÛÛÛÛÛÛÛÛÛÛ";
PRINT "Û ÛÛÛÛÛÛÛÛÛÛÛÛÜ ";
END IF
IF y% <= 47 THEN
LOCATE y% + 2, 1
PRINT "ÜÜÜÜÜÜÜÜÜÜ ÛÛÛÛÛ";
COLOR , 1: PRINT "ß";
COLOR 6: PRINT " ùúú";
COLOR 7: PRINT "ß";
COLOR , 0
PRINT "ÛÛÛ ÛÛÛ";
COLOR , 1
COLOR , 1: PRINT "ß";
COLOR 6: PRINT "ù ú ";
COLOR 7: PRINT "ß";
COLOR , 0
PRINT "ÛÛÛÛÛ ÜÜÜÜ";
END IF
IF y% <= 46 THEN
LOCATE y% + 3, 1
COLOR 1, 7
PRINT " þ þ þ þ þ þ þ ÞÛÛÛÛÛÛÝ ";
COLOR 7, 0
PRINT "Û Û";
COLOR 1, 7
PRINT " ÞÛÛÛÛÛÛÝ þ þ þ þ þ þ þ ";
END IF
IF y% <= 45 THEN
LOCATE y% + 4, 1
COLOR 7, 0
PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";
PRINT "ÛÛÛÛÛÛÛÛÛ";
PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";
END IF
IF y% <= 44 THEN
LOCATE y% + 5, 1
PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";
END IF
IF y% <= 43 THEN
LOCATE y% + 6, 1
PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ";
END IF
END SUB
SUB EraseImage (x%, y%, w%, h%)
REM --Test point (x%, y%) to see if it's valid--
IF (x% < 1) OR (x% > 80) OR (y% < 1) THEN EXIT SUB
REM --Erase image--
COLOR , 0
FOR y% = y% TO y% + h%
IF (y% > 49) THEN EXIT SUB
LOCATE y%, x%
PRINT SPACE$(w%);
NEXT y%
END SUB
'DIM SHARED KeysPressed$
SUB GetKeysPressed
REM --Make sure numlock is off--
DEF SEG = &H40
IF PEEK(&H17) THEN POKE &H17, 0
DEF SEG
TheKey% = INP(96)
REM --If key was let go--
IF TheKey% > 127 THEN
TheKey% = TheKey% AND 127
offset% = INSTR(KeysPressed$, CHR$(TheKey%))
IF offset% > 0 THEN KeysPressed$ = LEFT$(KeysPressed$, offset% - 1) + RIGHT$(KeysPressed$, LEN(KeysPressed$) - offset%)
REM --If a key was pressed--
ELSE
IF INSTR(KeysPressed$, CHR$(TheKey%)) = 0 THEN
KeysPressed$ = KeysPressed$ + CHR$(TheKey%)
END IF
END IF
DO: cmd$ = INKEY$: LOOP UNTIL cmd$ = ""
END SUB
SUB InitScreen
SCREEN 0
WIDTH 80, 50
END SUB
FUNCTION IsAsteroidCol% (AX, AY, AX2, AY2)
'----Asteroid----
'012345
' ÜÜÜ
' ÞÛÛÛÝ
' ÞÛÛÛÝ
' ßßß
'012345
'----------------
REM --Left or Right--
IF (AX + 4 < AX2) OR (AX > AX2 + 4) THEN
IsAsteroidCol% = 0
EXIT FUNCTION
END IF
REM --Above or Below
IF (AY + 3 < AY2) OR (AY > AY2 + 3) THEN
IsAsteroidCol% = 0
EXIT FUNCTION
END IF
IsAsteroidCol% = 1
END FUNCTION
FUNCTION IsBulletCol% (AX, AY, OX%, OY%)
'----Asteroid----
'012345
' ÜÜÜ
' ÞÛÛÛÝ
' ÞÛÛÛÝ
' ßßß
'012345
'----------------
REM Left or right
IF (OX% < AX) OR (OX% > AX + 4) THEN
IsBulletCol% = 0
EXIT FUNCTION
END IF
REM Above or below
IF (OY% < AY) OR (OY% > AY + 3) THEN
IsBulletCol% = 0
EXIT FUNCTION
END IF
REM --If the object is to the left or right--
IF (OX + OW% < SX%) OR (OX > SX% + 6) THEN
IsShipCollision% = 0
EXIT FUNCTION
END IF
REM --If the object is above or below--
IF (OY + OH% < SY%) OR (OY > SY% + 3) THEN
IsShipCollision% = 0
EXIT FUNCTION
END IF
REM --If it's in a space--
IF (OY + OH% <= SY% + 1) AND (OX + OW% < SX% + 2) THEN
IsShipCollision% = 0
EXIT FUNCTION
END IF
IF (OY + OH% <= SY% + 1) AND (OX > SX% + 4) THEN
IsShipCollision% = 0
EXIT FUNCTION
END IF
IF (OY + OH% = SY% + 2) AND (OX + OW% < SX% + 1) THEN
IsShipCollision% = 0
EXIT FUNCTION
END IF
IF (OY + OH% = SY% + 2) AND (OX > SX% + 5) THEN
IsShipCollision% = 0
EXIT FUNCTION
END IF
IsShipCollision% = 1
END FUNCTION
This message has been edited by iorr5t on Dec 14, 2005 7:45 PM