8bitworkshop/presets/vcs/bb/rblast106.bas

819 lines
22 KiB
QBasic

rem +-----------------------------------------+
rem | Road Blaster | 386 bytes free |
rem | for batariBasic | -> tested using |
rem | by Steve Engelhardt | bleeding edge |
rem | v0.65 (2/8/2006) | build 99a |
rem +-----------------------------------------+
rem
rem Version Notes
rem 0.42 working - car can now slow down by pressing down (Added 8.8 variables & fixed point math)
rem 0.43 working - player car slows down when hitting side of road
rem 0.44 working - slowdown when player car hits enemy car
rem 0.45 working - enemy missile causes car to bouce sideways a little
rem 0.46 testing - added some audio code - can't test it yet (.048 removed audio code to save ROM Space)
rem 0.47 working - Bugfix in diff A switch - made it so it only doubles size of car - no speed increase.
rem 0.48 working - car changes colors when hit - game pauses at the end.
rem 0.49 working - missile now properly disappears when it hits an enemy car (missile0y=0 & q=0).
rem 0.50 working - Saved 840 bytes by changing title screen pf data to data tables. :)
rem 0.51 working - Audio Routines added and working.
rem 0.52 working - Bugfix - if you held down on the joystick - enemy missiles would fire from the top
rem of the screen before the cars appeared there. It's been fixed.
rem 0.53 working - Bugfix - Setting difficulty to A - now the missile fires from the center of the
rem double sized player car.
rem 0.54 working - scoring change. 20pts every frame. -10 when you slow down, +10 when you speed up.
rem 0.55 working - implementing difficulty level increase during game.
rem cars start off in relatively straight track. (1st 4-7 scrolls)
rem cars start zig zagging (scroll 8-21) - cars turn yellow
rem cars start skidding l/r randomly (scroll 21+) - cars turn purple
rem cars & missiles speed up (scroll 30+) - cars turn red
rem 0.56 working - 2nd enemy car now turns into a powerup sprite when the other is hit.
rem Powerup increases car's hitpoints by +1 per frame while it's touching it.
rem 0.57 working - bugfix - left car doesn't disappear when shooting it at the beginning of the game.
rem 0.58 working - bugfix - powerup code seems to be working correctly now.
rem 0.59 working - revamping powerup code - now appears randomly, but stil causes damage to car.
rem 0.60 working - random powerup code works. Shooting one car will sometimes change the other
rem into a powerup, and sometimes it will remain a car. The powerup that appears does actually
rem increase your health, and hitting the remaining car does damage...it seems to be working.
rem 0.61 testing - Now back to trying to get that 2nd car to disappear when hit. :(. Widened the roadside.
rem 0.62 testing - if you shoot the left car first, the cars dissappear individually now when you shoot them.
rem if you shoot the right car first, the left car then shifts position to the left instead
rem of disappearing.
rem 0.63 working - you can now shoot each car individually, and they will both disappear individually.
rem powerups now appear at random, and will increase your car's health.
rem 0.64 working - powerups now won't fire at you - the missile resets to 0 when they appear.
rem 0.65 testing - color tweaking - road changed to brown, 3rd level cars brighter purple
rem
rem
rem Dev Notes/To Do List for future revisions:
rem
rem X-1. Make the cars "do something" when they're hit - move down, left or right a little, or shake. Right now
rem enemy missiles and cars just pass right through you.
rem :::--> Done.
rem X-2. Scroll Speed Tweaking -- I'll try to add the ability to slow your car down by pressing down on the
rem joystick make hitting the side of the road slow you down & hitting an enemy car should also slow you.
rem :::--> Done.
rem X-3. Change Human Player sprite so the tires move when you go left and right.
rem :::--> Done.
rem X-4. Variations on Enemy Car movement - it's pretty predictable right now.
rem :::--> Done, although it may need tweaking.
rem X-5. I may play with the enemy car shots a bit - I like the moving missile now, but I could provide the option for
rem enemy car shots that don't move.
rem :::--> I'm going to leave the enemy shots as they are.
rem X-6. I need to add sound to the game.
rem :::--> Done.
rem X-7. I may try and implement a "pause" feature with the color/bw switch -- just to see if I can do it.
rem :::--> I Changed my mind - this game doesn't really need that, and I'm running out of free bytes.
rem X-8. Update Car Sprites - they're functional but could be better.
rem :::--> Done.
rem X-9. Increase scoring rate when driving faster; decrease when driving slower.
rem :::--> Done.
rem X10. Progressively increase difficulty
rem :::--> It works, but may need to be tweaked later.
rem X11. Add in a way to repair your car; perhaps by picking up an object off the road or something;
rem or just repairing at certain point levels rem (evey 20,000 points? Every 50,000?)
rem :::--> Cars are repaired by picking up powerups. A powerup appears in place of the 2nd car when one is hit.
rem X12. If a powerup appears, make sure it doesn't fire at you.
rem :::--> Done.
rem 13. Make sure cars don't scroll off the road.
rem :::--> Testing, testing, testing.
rem
rem
rem V103 Changes
rem Right Difficulty switch will now remove roadblocks
rem Color/BW switch toggles between normal mode and invincible (practice) mode
rem Title Screen Changed
rem Road narrowed, the wide road caused the screen to roll on real hardware
rem Erratic l/r movement removed on fastest enemy car speed
rem
rem V105 Changes
rem Audio sound added to death
rem Road flashes at death
rem time screen pauses at death increased a little bit
rem Powerups do not appear if you're pushing up on the joystick to go faster.
rem scroll speed slows when you slow down, does not increase when you push up.
rem
init
include fixed_point_math.asm
set romsize 8k
rem set debug cycles
rem
rem ** Use 8.8 variables for enemy car & missile scrolling
rem
dim scroll=m.n
dim mis=k.j
rem
rem -------------
rem Set Variables
rem -------------
a=0 : rem A = The Enemy Car's X Position + 8
b=82 : rem X Position of Ball
c=0 : rem Hitpoint Counter for Enemy Car Collision
d=0 : rem
rem e is not used
f=0 : rem counter
rem g is not used
h=0 : rem H is used as a flag to know when NUSIZ1 has been changed to 0
i=0 : rem Flag for Displaying Title Screen
j=0 : rem part of mis 8.8 variable
k=0 : rem part of mis 8.8 variable
rem l=0 : rem l is a random number generator for choosing enemy car sprites
m=0 : rem part of scroll 8.8 variable
n=0 : rem part of scroll 8.8 variable
o=0 : rem counter
p=85 : rem Y Position of Player 0 (Human Car)
q=0 : rem missile0 firing
r=0 : rem pause timer
s=30
scroll=1.0 : rem Y Position of Player 1 (Enemy Car)
t=0 : rem Scroll counter
u=94 : rem X Position of Player 1 (Enemy Car)
rem v=0 : rem V is random number generator for placing roadblocks
W=0 : rem color flag
x=75 : rem X Position of Player 0 (Human Car)
y=16 : rem color cycler
z=0 : rem Z is a flag - when it equals 1, an enemy car has been hit by a missile.
mis=1.0
missile0x=0:missile0y=0
missile1x=0:missile1y=0
COLUP1=208:COLUP0=0
rem
rem -------------
rem Set Colors
rem -------------
COLUPF=160: rem was 144
COLUBK=0
CTRLPF=$35
scorecolor=246
rem
rem -----------------------------
rem Draw RoadBlaster Title Screen
rem -----------------------------
intro
g=g+1
if g=2 then pfscroll down :g=0
y=y+1
if y<17 then y=16
if y>29 then y=16
rem
rem -----------------------------
rem Draw RoadBlaster Title Screen
rem -----------------------------
pfpixel 7 1 on : pfpixel 25 1 on
pfpixel 7 2 on : pfpixel 25 2 on
pfpixel 7 3 on : pfpixel 25 3 on
pfpixel 7 4 on : pfpixel 25 4 on
pfpixel 7 5 on : pfpixel 25 5 on
pfpixel 7 6 on : pfpixel 25 6 on
pfpixel 7 7 on : pfpixel 25 7 on
pfpixel 7 8 on : pfpixel 25 8 on
pfpixel 7 9 on : pfpixel 25 9 on
COLUP0=64
COLUP1=y:rem was 46
NUSIZ1=$05
NUSIZ0=$27
AUDV0=0:AUDV1=0
player1:
%00100011
%00100100
%00111110
%00100001
%00111110
%00000000
%00000000
%00011111
%00100000
%00111100
%00100000
%00011111
%00000000
%00000000
%00000100
%00000100
%00000100
%00111111
%00000000
%00000000
%00111111
%00000001
%00111111
%00100000
%00111111
%00000000
%00000000
%00100001
%00111111
%00100001
%00011110
%00000000
%00000000
%00111111
%00100000
%00100000
%00100000
%00000000
%00000000
%00111110
%00100001
%00111110
%00100001
%00111110
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00111110
%00100001
%00100001
%00111110
%00000000
%00000000
%00100001
%00111111
%00100001
%00011110
%00000000
%00000000
%00111111
%00100001
%00100001
%00111111
%00000000
%00000000
%00100011
%00100100
%00111110
%00100001
%00111110
end
player0:
%00000000
%01000010
%01111110
%01111110
%00111100
%00011000
%00011000
%00011000
%10011001
%10011001
%11111111
%11111111
%10011001
%10011001
%00011000
%00011000
%00011000
%00011000
%10011001
%10011001
%11111111
%11111111
%10011001
%10011001
%00011000
%00011000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00000000
%00011000
%00011000
%10111101
%10111101
%11111111
%11111111
%10111101
%10111101
%00111100
%00111100
%00111100
%10111101
%10100101
%11100111
%11100111
%11100111
%10111101
%10111101
%00111100
%00011000
%01111110
%01000010
%01111110
%01000010
end
drawscreen
player1x=68:player1y=82
player0x=88:player0y=83
missile0height=2
e=e+1
missile0x=104:missile0y=s
if s>52 then s=30
if e=2 then s=s+1:e=0
rem if s>52 then s=30
t=0
if i=1 then goto main
rem
rem ** when the game starts, flip the titlscreen off to clear the playfield
rem
if joy0down then i=1 : score=0 : g=0:i=0:goto intro2 : rem restart game if joystick is pushed down
if switchreset then i=1 : score=0 : g=0:i=0:goto intro2 : rem restart game if the reset switch is pressed
if joy0fire then i=1: score=0 : g=0:i=0:goto intro2
goto intro
intro2
gosub MakeNewCar1
s=0
g=0
e=0
missile0x=0:missile0y=0
rem --------------
rem Main Game Loop
rem --------------
main
y=y+1
if y>250 then y=1
rem if u>120 then u=u-1
rem if u<64 then u=u+1
if c<1 then c=1
if switchbw then c=0 : rem if c=0, invincible mode
if joy0up then goto audskip
if joy0down then goto audskip
AUDF0=18:AUDC0=14:AUDV0=10
rem if scroll counter goes over 240, reset it back to highest speed level.
if t>240 then t=31
audskip
if scroll > 90 then o=0
if scroll > 96 then w=0 : h=0
if scroll > 96 then u=94
rem
rem ** scroll is the Y Position of Enemy Car -- If the Y Position is less than 94, Scroll car down.
rem ** T is a scroll counter. Every time the cars scroll through the screen once, t is incremented.
rem
e=e+1
if e=2 && t < 10 then e=0:goto skipscroll
if scroll < 97 then scroll=scroll+1.0 else scroll=0.0 : t=t+1
if scroll < 97 && t > 35 then scroll=scroll+0.9 : mis=mis+0.9 : rem incr speed after 30 scrolls (Level 4)
skipscroll
gosub CarCreate
rem
rem -------------------------------------
rem Random Enemy Car & Roadblock Behavior
rem -------------------------------------
rem
rem if framecounter is less than 8, the cars will follow a straight track.
v=rand
if t > 30 then skipmv
if t < 8 then goto skipmv : rem if framecounter is less than eight, skip l/r bouncing. (Level 1->2)
rem if t > 20 && v > 215 then u=u-1 : rem randomly 'skids' computer car to the Left after 21 frames (Level 3)
if t > 20 && v < 35 then u=u+1 : rem randomly 'skids' computer car to the Right after 21 frames
skipmv
rem
rem ** The following will randomly generate the roadblock at 9 different X Positions.
rem ** B is the X Position of the Ball
rem
if v=2 && scroll > 86 then b = 75 : rem Create Roadblock at X Position 75
if v=234 && scroll > 86 then b = 105 : rem Create Roadblock at X Position 105
if v=112 && scroll > 86 then b = 89 : rem Create Roadblock at X Position 89
if v=50 && scroll > 86 then b = 81 : rem Create Roadblock at X Position 81
if v=188 && scroll > 86 then b = 115 : rem Create Roadblock at X Position 115
if v=166 && scroll > 86 then b = 79 : rem Create Roadblock at X Position 79
if v=132 && scroll > 86 then b = 95 : rem Create Roadblock at X Position 95
if v=176 && scroll > 86 then b = 111 : rem Create Roadblock at X Position 111
rem if v=209 && scroll > 86 then b = 120: rem Create Roadblock at X Position 120
if v < 10 then u=u+1 : rem cars start out in relatively straight track
if v > 245 then u=u-2 : rem as soon as they hit a wall, they will start zig zagging
if d>0 then COLUP1=22 : rem level 2 car color is yellow (if d is over 0, car is zigzagging)
if t>20 && t<36 then COLUP1=104 : rem level 3 car color is purple
if t>35 then COLUP1=68 : rem level 4 car color is red
rem
rem D is the left/right movement flag, set when the enemy car collides with playfield (side of road)
rem
if d=1 then u=u+1
if d=2 then u=u-1
skiplr
rem
rem ** Player 1 is the Computer Controlled Car
rem
rem ** Rem D will only equal zero once - when the game first starts.
rem ** The next line is there to make sure a car is created when the game first starts.
rem
rem if d=0 then gosub MakeNewCar3
rem
rem ** Go to subroutine that randomly picks an enemy car sprite.
rem
rem gosub CarCreate
rem
rem ** Z is a flag - when it equals 1, an enemy car has been hit by a missile.
rem ** If the cars have scrolled off the screen (scroll>94), this flag is reset to 0.
rem ** W is a color flag set in the carhit subroutine
rem
if scroll > 96 then z=0
rem
rem ** Z Flag is set to 1 when collision occurs and Reset to Zero when cars scroll off the bottom of the screen.
rem
if z=0 then NUSIZ1=$01
rem
rem ** If Left Difficulty is set to A, the human car is twice as wide
rem
if switchleftb then NUSIZ0=$00 else NUSIZ0=$05
rem
rem ** W Flag is set during the carhit subroutine
rem ** if w is 1 Change Player1 Car Color to Black
rem
rem if w=1 then COLUP1=0 else COLUP1=52
rem
rem ** Player1's X and Y Position.
rem
player1y=scroll : player1x=u
skiplrm
rem
rem ** player0 is the Human car
rem
if joy0left then goto TurnCar1
if joy0right then goto TurnCar2
player0:
%01111110
%01000010
%00111100
%10100101
%11100111
%10111101
%00111100
%10011001
%11111111
%10011001
end
turned
rem
rem ** Set Playfield to scroll down
rem
if joy0down then skipscrl
pfscroll down
skipscrl
g=g+1
if g=2 then pfscroll down:g=0
skipsc
rem
rem ** Set Human Car's Color and X/Y Position
rem
if c < 11 then COLUP0=128
if c > 10 && c < 21 then COLUP0=60
if c > 20 && c < 31 then COLUP0=30
if c > 30 && c < 41 then COLUP0=64
if c > 40 && c < 61 then COLUP0=y
player0x=x : player0y=p
rem
rem ** Create the 2 sides of the Road
rem
pfpixel 7 1 on : pfpixel 25 1 on
pfpixel 7 3 on : pfpixel 25 3 on
pfpixel 7 5 on : pfpixel 25 5 on
pfpixel 7 7 on : pfpixel 25 7 on
pfpixel 7 9 on : pfpixel 25 9 on
drawscreen
rem
rem ** Create Roadblock
rem
if switchrightb then ballx=0:bally=0:goto skipb
ballx=b : bally=scroll+15 : ballheight=2
skipb
rem
rem ** Move Human Car (Player0)
rem
if joy0left then x=x-1
if joy0right then x=x+1
if joy0up then scroll=scroll+0.3 : mis=mis+0.5 : score=score+10 : AUDF0=12:AUDC0=14:AUDV0=10
if joy0down && scroll >=1 then scroll=scroll-0.3 : mis=mis-0.5 : score=score-10: AUDF0=24:AUDC0=14:AUDV0=10
rem
rem ** Detect Joystick Button press - fire missile
rem
if joy0fire && q<1 then AUDF1=8:AUDC1=1:AUDV1=15 : goto playerfires
if q>0 then q=q-2 : missile0y=q
if q>50 then AUDV1=0
rem
rem ** Enemy Cars fire back
rem
if scroll >35 && t<10 then goto fireskip : rem when car is really slow, don't fire twice
if scroll >50 && t<36 then goto fireskip : rem in invincible mode, if cars are stuck together at bottom, don't fire again.
if scroll >60 && t>35 then goto fireskip : rem let bullets get all the way to the bottom before resetting
if h=1 then goto fireskip : rem if powerup is activated, don't fire.
if scroll<=1 then mis=1.0 : AUDF1=13:AUDC1=1:AUDV1=9
if mis > 18 then AUDV1=0
missile1y=mis : missile1x=u : missile1height=6
mis=mis+2.0
goto pskip
fireskip
missile1y=0: missile1x=0
pskip
rem
rem ---------------------------
rem Collision Routines
rem ---------------------------
rem
rem
rem ** Don't allow Human car to drive off the road
rem
if collision(playfield,player0) && x > 75 then x=x-2
if collision(playfield,player0) && x < 75 then x=x+2
rem
rem ** When Computer Controlled car hits the playfield, bounce the other direction
rem
if collision(player1,playfield) && u > 100 then d=2
if collision(player1,playfield) && u < 80 then d=1
rem
rem ** When Human Controlled car hits the playfield, slow the car down.
rem
if collision(player0,playfield) && scroll >=1 then scroll=scroll-0.5 : mis=mis-0.5
rem
rem ** If Player Car hits Computer Car, increase hitpoint counter. At 60, end Game
rem ** C is increased by more than 1 during a collision - Don't know why.
rem
if collision(player1,player0) && w=1 then gosub addhitpoints
if w=1 then goto damageskip
if collision(player1,player0) then c=c+1 : if c=60 then r=120: goto thisisit
if collision(player1,player0) && scroll >=1 then scroll=scroll-1.5 : mis=mis-1.5
rem
rem ** If Player missile hits computer car, increase score by 1000
rem
if collision(player1,missile0) then missile0y=1 : goto carhit
rem
rem ** If Enemy missile hits player car, add damage to player car
rem
if collision(player0,missile1) && x > 75 then c=c+1 : x=x-2 : if c=60 then r=160: goto thisisit
if collision(player0,missile1) && x < 75 then c=c+1 : x=x+2 : if c=60 then r=160: goto thisisit
damageskip
rem
rem ** If Player car hits roadblock bouce away from it
rem
if collision(player0,ball) && u > 90 then x=x-6
if collision(player0,ball) && u < 90 then x=x+6
rem
rem ** Increase score by 20 (Just for staying alive)
rem
score=score+20
rem
rem ** Loop Back to Main
rem
goto main
rem
rem -----------------------
rem Fire Missile Subroutine
rem -----------------------
rem
playerfires
if !switchleftb then missile0x=x+10 else missile0x=x+4
q=80 : missile0y=75
missile0height=6
rem
goto main
rem
thisisit
rem
rem -----------------------------
rem 'Game Over' Screen Subroutine
rem -----------------------------
rem
rem ** This subroutine is kind of a leftover from a previous revision -
rem ** It changes some colors when the game ends.
AUDV0=0
rem COLUP0=0
rem COLUP1=0
rem scorecolor=208
goto eog
end
rem -----------------------------------
rem Enemy Car hit by Missile Subroutine
rem -----------------------------------
carhit
a=u
rem ** Score is increased by 1000 when the missile hits the enemy car
rem
rem ** I originally set missle0x=60 to hide the missile behind the side of the road
rem ** I changed this to missiley=0 to jump it up to the top of the screen when a car is hit.
z=1 : score = score + 1000 : missile0y=0 : q=0
rem
rem ** A = The Enemy Car's X Position + 8
rem
a=u+8
rem
rem ** A = X Posiiton of Player1 (+8)
rem ** If X Position of Missile0 Hit is less than (X+8) from Player1, set Nusiz1 to 0 to erase car
rem
if o<1 then goto skipblank
if o>0 then goto blankcar
skipblank
if missile0x < a then NUSIZ1=0 : o=o+1 : u=u+16
if missile0x > a then NUSIZ1=0 : o=o+1
199 l=rand:if l>215 then 199
l=l/8:l=l+1
if joy0up then goto main : rem skip powerups if you're travelling full speed
if l < 10 && scroll > 1 then gosub powerup : w=1
goto main
rem
rem ----------------------------
rem EOG (End of Game) Subroutine
rem ----------------------------
rem
rem ** This routine turns all the "roadway" pixels off -- clearing the playfield for the title screen
rem
eog
if r<1 then r=88:goto eog2
r=r-1
gosub explode
COLUPF=r
AUDF0=160-r:AUDC0=1:AUDV0=6
drawscreen
goto eog
eog2
COLUP0=68
AUDV0=0
r=r-1
e=e+1
if e=2 then pfscroll up:e=0
player0y=r
player1y=0
missile0y=0
missile1y=0
COLUPF=160
drawscreen
if r<1 then pfclear:goto init
ballx=0:bally=0
scroll=0
t=0
goto eog2
CarCreate
if scroll<96 then return
200 l=rand:if l>215 then 200
l=l/8:l=l+1
if l>1 && l<6 then gosub MakeNewCar1 : return
if l>5 && l<11 then gosub MakeNewCar2 : return
if l>10 && l<16 then gosub MakeNewCar3 : return
if l>15 && l<21 then gosub MakeNewCar4 : return
if l>20 && l<28 then gosub MakeNewCar5 : return
return
MakeNewCar1
player1:
%10011001
%11111111
%10011001
%00011000
%10111101
%11111111
%10011001
%00111100
end
return
MakeNewCar2
player1:
%10111101
%11111111
%10111101
%00100100
%11100111
%10111101
%01000010
%01111110
end
return
MakeNewCar3
player1:
%10011001
%11111111
%10011001
%00011000
%11011011
%11111111
%11011011
%00100100
end
return
MakeNewCar4
player1:
%10011001
%11111111
%10011001
%00011000
%00011000
%10011001
%11111111
%10011001
end
return
MakeNewCar5
player1:
%10011001
%11111111
%10011001
%00111100
%10100101
%11111111
%10011001
%00100100
end
return
TurnCar1
player0:
%01111110
%01000010
%00111100
%10100101
%11100111
%10111101
%00111100
%01011001
%11111111
%10011010
end
goto turned
TurnCar2
player0:
%01111110
%01000010
%00111100
%10100101
%11100111
%10111101
%00111100
%10011010
%11111111
%01011001
end
goto turned
powerup
h=1
missile0y=0: q=0
player1:
%11111111
%10000001
%10011001
%10011001
%10111101
%10111101
%10011001
%10011001
%10000001
%11111111
end
return
addhitpoints
if h=1 then c=c-1
return
rem
blankcar
u=94
player1:
%00000000
end
goto main
explode
COLUPF=70
COLUP0=64
player0:
%01111110
%01000010
%00111100
%10100101
%11110111
%00111000
%10001100
%10011001
%01101110
%00000000
end
return
player0:
%10000001
%00100100
%00000000
%00011001
%10011000
%00000000
%00100100
%10000001
end