.MA26 LDA QQ11 ; If this is not a space view, jump to MA15 to skip BEQ P%+5 ; missile and laser locking JMP MA15 JSR PLUT ; Call PLUT to update the geometric axes in INWK to ; match the view (front, rear, left, right) LDA LAS ; If we are firing our laser then LAS will contain the BNE main37 ; laser power (which will be non-zero), so jump to ; main37 to check if the current ship is in the ; crosshairs, to see if we are hitting it LDA MSAR ; If the active missile is not looking for a target then BEQ main38 ; MSAR will be zero, so jump to main38 to skip the ; following, as we can't target lock an unarmed missile LDA MSTG ; If MSTG is positive (i.e. it does not have bit 7 set), BPL main38 ; then it indicates we already have a missile locked on ; a target (in which case MSTG contains the ship number ; of the target), so jump to main38 to skip targeting ; ; Or to put it another way, if MSTG = $FF, which means ; there is no current target lock, then keep going .main37 JSR HITCH ; Call HITCH to see if this ship is in the crosshairs, BCS main39 ; in which case the C flag will be set and we jump to ; main39 (so if there is no missile or laser lock, we ; jump to MA8 to skip the following) .main38 JMP MA8 ; Jump to MA8 to skip the following .main39 LDA MSAR ; We have missile lock, so check whether the leftmost BEQ MA47 ; missile is currently armed, and if not, jump to MA47 ; to process laser fire, as we can't lock an unarmed ; missile LDA MSTG ; If MSTG is positive (i.e. it does not have bit 7 set), BPL MA47 ; then it indicates we already have a missile locked on ; a target (in which case MSTG contains the ship number ; of the target), so jump to MA47 to skip setting the ; target and beeping JSR BEEP_b7 ; We have missile lock and an armed missile, so call ; the BEEP subroutine to make a short, high beep LDX XSAV ; Call ABORT2 to store the details of this missile LDY #109 ; lock, with the targeted ship's slot number in X JSR ABORT2 ; (which we stored in XSAV at the start of this ship's ; loop at MAL1), and set the colour of the missile ; indicator to the pattern number in Y (red ; indicator = pattern 109) .MA47 ; If we get here then the ship is in our sights, but ; we didn't lock a missile, so let's see if we're ; firing the laser LDA LAS ; If we are firing the laser then LAS will contain the BEQ MA8 ; laser power (which we set in MA68 above), so if this ; is zero, jump down to MA8 to skip the following LDX #15 ; We are firing our laser and the ship in INWK is in JSR EXNO ; the crosshairs, so call EXNO to make the sound of ; us making a laser strike on another ship LDA TYPE ; Did we just hit the space station? If so, jump to CMP #SST ; MA14+2 to make the station hostile, skipping the BEQ MA14+2 ; following as we can't destroy a space station CMP #SPL ; Did we just hit a splinter? If not jump to main40 to BNE main40 ; skip the following LDX LAS ; We just hit a splinter, so we now check whether we CPX #Mlas ; have a mining laser fitted (in which case the laser BEQ MA14+2 ; power in LAS will be Mlas), and if so, jump to MA14+2 ; to skip the following, so we can't destroy splinters ; with mining lasers (which is handy, as we probably ; want to scoop them up instead) .main40 CMP #CON ; If the ship we hit is less than #CON - i.e. it's not BCC BURN ; a Constrictor, Cougar, Dodo station or the Elite logo, ; jump to BURN to skip the following LDA LAS ; Set A to the power of the laser we just used to hit ; the ship (i.e. the laser in the current view) CMP #(Armlas AND 127) ; If the laser is not a military laser, jump to MA14+2 BNE MA14+2 ; to skip the following, as only military lasers have ; any effect on the Constrictor or Cougar LSR LAS ; Divide the laser power of the current view by 4, so LSR LAS ; the damage inflicted on the super-ship is a quarter of ; the damage our military lasers would inflict on a ; normal ship .BURN LDA INWK+35 ; Fetch the hit ship's energy from byte #35 and subtract SEC ; our current laser power, and if the result is greater SBC LAS ; than zero, the other ship has survived the hit, so BCS MA14 ; jump down to MA14 to make it angry ASL INWK+31 ; Set bit 7 of the ship byte #31 to indicate that it has SEC ; now been killed ROR INWK+31 JSR HideShip_b1 ; Update the ship so it is no longer shown on the ; scanner LDA LAS ; Are we using mining lasers? If not, jump to nosp to CMP #Mlas ; spawn canisters, otherwise keep going BNE nosp ; If we get here then we are using mining lasers LDA TYPE ; Did we just kill an asteroid? If so, jump to main41 CMP #AST ; to break the asteroid up into splinters BEQ main41 CMP #6 ; Did we just kill a boulder? If not jump to nosp to BNE nosp ; spawn canisters, otherwise keep going ; If we get here then we are using mining lasers and we ; just blasted a boulder JSR DORND ; Set A and X to random numbers BPL main43 ; If bit 7 of A is clear (50% chance), jump to main43 to ; skip spawning any splinters LDA #1 ; Otherwise set A = 1 so we spawn one splinter below BNE main42 ; Jump to main42 to spawn one splinter (this BNE is ; effectively a JMP as A is never zero) .main41 ; If we get here then we are using mining lasers and we ; just blasted an asteroid JSR DORND ; Set A and X to random numbers ORA #1 ; Reduce the random number in A to the range 1-3 AND #3 .main42 LDX #SPL ; Set X to the ship type for a splinter JSR SPIN2 ; Call SPIN2 to spawn A items of type X (so we spawn ; 1-3 splinters if we just destroyed an asteroid, or we ; spawn one splinter 50% of the time if we just ; destroyed a boulder) JMP main43 ; Jump to main43 to skip spawning canisters .nosp LDY #PLT ; Randomly spawn some alloy plates JSR SPIN LDY #OIL ; Randomly spawn some cargo canisters JSR SPIN .main43 LDX TYPE ; Set X to the type of the ship that was killed so the ; following call to EXNO2 can award us the correct ; number of fractional kill points JSR EXNO2 ; Call EXNO2 to process the fact that we have killed a ; ship (so increase the kill tally, make an explosion ; sound and so on) .MA14 STA INWK+35 ; Store the hit ship's updated energy in ship byte #35 LDA TYPE ; Call ANGRY to make this ship hostile, now that we JSR ANGRY ; have hit itName: Main flight loop (Part 11 of 16) [Show more] Type: Subroutine Category: Main loop Summary: For each nearby ship: Process missile lock and firing our laser Deep dive: Program flow of the main game loop Flipping axes between space viewsContext: See this subroutine in context in the source code References: No direct references to this subroutine in this source file
The main flight loop covers most of the flight-specific aspects of Elite. This section covers the following: * Continue looping through all the ships in the local bubble, and for each one: * If this is not the front space view, flip the axes of the ship's coordinates in INWK * Process missile lock * Process our laser firing
[X]
Subroutine ABORT2 (category: Dashboard)
Set/unset the lock target for a missile and update the dashboard
[X]
Subroutine ANGRY (category: Tactics)
Make a ship hostile
[X]
Configuration variable AST = 7
Ship type for an asteroid
[X]
Configuration variable Armlas = INT(128.5 + 1.5*POW)
Military laser power
[X]
Subroutine BEEP_b7 (category: Sound)
Call the BEEP routine in ROM bank 7
[X]
Label BURN is local to this routine
[X]
Configuration variable CON = 31
Ship type for a Constrictor
[X]
Subroutine DORND (category: Maths (Arithmetic))
Generate random numbers
[X]
Subroutine EXNO (category: Sound)
Make the sound of a laser strike or ship explosion
[X]
Subroutine EXNO2 (category: Status)
Process us making a kill
[X]
Subroutine HITCH (category: Tactics)
Work out if the ship in INWK is in our crosshairs
[X]
Subroutine HideShip_b1 (category: Dashboard)
Update the current ship so it is no longer shown on the scanner
[X]
Label MA14 is local to this routine
[X]
[X]
Label MA15 in subroutine Main flight loop (Part 12 of 16)
[X]
Label MA47 is local to this routine
[X]
Label MA8 in subroutine Main flight loop (Part 12 of 16)
[X]
Configuration variable Mlas = 50
Mining laser power
[X]
Configuration variable OIL = 5
Ship type for a cargo canister
[X]
Configuration variable PLT = 4
Ship type for an alloy plate
[X]
Subroutine PLUT (category: Flight)
Flip the coordinate axes for the four different views
[X]
Subroutine SPIN (category: Universe)
Randomly spawn cargo from a destroyed ship
[X]
Configuration variable SPL = 8
Ship type for a splinter
[X]
Configuration variable SST = 2
Ship type for a Coriolis space station
[X]
Label main37 is local to this routine
[X]
Label main38 is local to this routine
[X]
Label main39 is local to this routine
[X]
Label main40 is local to this routine
[X]
Label main41 is local to this routine
[X]
Label main42 is local to this routine
[X]
Label main43 is local to this routine
[X]
Label nosp is local to this routine