If you recall, when we gave the Aliens the ability to fire missiles, one of tests that the code performs is to see if the Alien is positioned in the range 8pixels either side of the player - this seems a bit restrictive to me, so let's add a new Variable to the Spawner event (TYPE 7) which will allow us to define the distance either side of the player that an alien needs to be in to be allowed the chance of firing their missile.
We'll add in variable I to the list of values we'll read in
IF SETTINGA = 0 ; first time we run this
LET JUMPSPEED = 0 ; reset the enemies spawned counter
LET SETTINGB = 0 ; reset the timer
RESTORE ; start from the beginning of the data table
REPEAT L ; get the data for this level
READ AIRBORNE ; get the spawner movement
READ X ; get starting x position
READ Y ; get starting y position
READ J ; get the enemy sprite type
READ K ; get the enemy image
READ E ; how many enemies in this level?
READ G ; delay between releasing each enemy
READ P ; points for a kill
READ C ; colour
READ W ; weapon
READ H ; fire weapon probability
READ Q ; min height to release weapons
READ I ; x distance for alien weapon triggering
ENDREPEAT
LET D = E ; how many kills to get bonus?
LET F = E ; enemies remaining
ADD 1 TO SETTINGA ; prevent this running again
ENDIF
Then make sure to add a new value to the end of each row in your data table:
DATA 0 132 8 5 2 8 8 5 67 1 10 100 8
DATA 0 100 8 5 2 10 8 10 68 1 10 100 32
By altering these values you can make the aliens fire when further horizontally away from the player (or when nearer)
Next, there's some code in the Alien event (Type 5) that is repetitive, we could save a few bytes by optimising it, specifically the test to see if the player is out of bounds:
We could optimise this by using the DIRECTION variable, setting it to 254 whenever an enemy leaves the screen:
So, we will change this:
; BOUNDARY CHECKING
; ===================
IF X <= LEFTEDGE ; if alien reaches the left edge
REMOVE ; remove it
SUBTRACT 1 FROM S ; decrement the sprite counter
SUBTRACT 1 FROM F ; decrement the number of aliens still in
ENDIF
IF X >= RIGHTEDGE ; if alien reaches the right edge
REMOVE ; remove it
SUBTRACT 1 FROM S ; decrement the sprite counter
SUBTRACT 1 FROM F ; decrement the number of aliens still in
ENDIF
IF Y >= BOTTOMEDGE ; if alien reaches the right edge
REMOVE ; remove it
SUBTRACT 1 FROM S ; decrement the sprite counter
SUBTRACT 1 FROM F ; decrement the number of aliens still in
ENDIF
to this:
; BOUNDARY CHECKING
; ===================
IF X <= LEFTEDGE ; if alien reaches the left edge
LET DIRECTION = 254 ; enemy is out of bounds
ENDIF
IF X >= RIGHTEDGE ; if alien reaches the right edge
LET DIRECTION = 254 ; enemy is out of bounds
ENDIF
IF Y >= BOTTOMEDGE ; if alien reaches the right edge
LET DIRECTION = 254 ; enemy is out of bounds
ENDIF
IF DIRECTION =254 ; is enemy out of bounds?
REMOVE ; remove it
SUBTRACT 1 FROM S ; decrement the sprite counter
SUBTRACT 1 FROM F ; decrement the alien counter
ENDIF
That should save us a few bytes, plus makes it easy if we want to remove a sprite (but not kill it) in other parts of the game.
And that, I think, should wrap it all up for now and give you a lightweight (currently uses approx 14,500 bytes) framework for building Shoot em ups in MPAGD.
I'm off o tidy up the comments in the code then I'll release the whole project on the itch website so you can get started quickly!
Comments