Skip to navigation

Elite on the BBC Micro and NES

Version analysis of Main game loop (Part 4 of 6)

This code appears in the following versions (click to see it in the source code):

Code variations between these versions are shown below.

Name: Main game loop (Part 4 of 6) Type: Subroutine Category: Main loop

Code variation 1 of 23A variation in the comments only

Tap on a block to expand it, and tap it again to revert.

Summary: Potentially spawn a lone bounty hunter, a Thargoid, or up to four pirates
Summary: Potentially spawn a lone bounty hunter or up to four pirates

Code variation 2 of 23A variation in the comments only

This variation is blank in the Cassette, Disc (flight) and Electron versions.


This section covers the following:

Code variation 3 of 23A variation in the comments only

Tap on a block to expand it, and tap it again to revert.

* Potentially spawn (35% chance) either a lone bounty hunter (a Mamba, Python or Cobra Mk III), a Thargoid, or a group of up to 4 pirates (Sidewinders and/or Mambas)
* Potentially spawn (47% chance) either a lone bounty hunter (a Cobra Mk III, Asp Mk II, Python or Fer-de-lance), or a group of up to 4 pirates (a mix of Sidewinders, Mambas, Kraits, Adders, Geckos, Cobras Mk I and III, and Worms) * Also potentially spawn a Constrictor if this is the mission 1 endgame, or Thargoids if mission 2 is in progress
* Potentially spawn (35% chance) either a lone bounty hunter (a Cobra Mk III, Asp Mk II, Python or Fer-de-lance), a Thargoid, or a group of up to 4 pirates (a mix of Sidewinders, Mambas, Kraits, Adders, Geckos, Cobras Mk I and III, and Worms) * Also potentially spawn a Constrictor if this is the mission 1 endgame, or Thargoids if mission 2 is in progress
* Potentially spawn (35% chance) either a lone bounty hunter (a Mamba, Python or Cobra Mk III), or a group of up to 4 pirates (Sidewinders and/or Mambas)

Code variation 4 of 23A variation in the labels only

Tap on a block to expand it, and tap it again to revert.

DEC EV \ Decrement EV, the extra vessels spawning delay, and BPL MLOOP \ jump to MLOOP if it is still positive, so we only \ do the following when the EV counter runs down
DEC EV \ Decrement EV, the extra vessels spawning delay, and if BPL MLOOPS \ it is still positive, jump to MLOOPS to stop spawning, \ so we only do the following when the EV counter runs \ down
 INC EV                 \ EV is negative, so bump it up again, setting it back
                        \ to 0

Code variation 5 of 23Related to an enhanced feature

In mission 2, after picking up the plans, there's an extra 22% chance that a Thargoid will spawn (this is on top of the normal spawning rate of pirates, bounty hunters and Thargoids).

This variation is blank in the Cassette and Electron versions.

LDA TP \ Fetch bits 2 and 3 of TP, which contain the status of AND #%00001100 \ mission 2 CMP #%00001000 \ If bit 3 is set and bit 2 is clear, keep going to BNE nopl \ spawn a Thargoid as we are transporting the plans in \ mission 2 and the Thargoids are trying to stop us, \ otherwise jump to nopl to skip spawning a Thargoid

Code variation 6 of 23Related to the Master version

In the disc and 6502SP versions there's a 22% chance of spawning a Thargoid during mission 2, while it's a 14% chance in the Master version.

This variation is blank in the Cassette, Master and Electron versions.

JSR DORND \ Set A and X to random numbers CMP #200 \ If the random number in A < 200 (78% chance), jump to BCC nopl \ nopl to skip spawning a Thargoid .fothg2 JSR GTHG \ Call GTHG to spawn a Thargoid ship and a Thargon \ companion .nopl
 JSR DORND              \ Set A and X to random numbers

 LDY gov                \ If the government of this system is 0 (anarchy), jump
 BEQ LABEL_2            \ straight to LABEL_2 to start spawning pirates or a
                        \ lone bounty hunter

Code variation 7 of 23Related to a standard feature

In the disc there's a 47% chance of spawning a group of pirates or a lone bounty hunter, while in the other versions there's a 35% chance.

Tap on a block to expand it, and tap it again to revert.

CMP #90 \ If the random number in A >= 90 (65% chance), jump to BCS MLOOP \ MLOOP to stop spawning (so there's a 35% chance of \ spawning pirates or a lone bounty hunter)
CMP #120 \ If the random number in A >= 120 (53% chance), jump to BCS MLOOPS \ MLOOPS to stop spawning (so there's a 47% chance of \ spawning pirates or a lone bounty hunter)
CMP #90 \ If the random number in A >= 90 (65% chance), jump to BCS MLOOPS \ MLOOPS to stop spawning (so there's a 35% chance of \ spawning pirates or a lone bounty hunter)

Code variation 8 of 23A variation in the labels only

Tap on a block to expand it, and tap it again to revert.

AND #7 \ Reduce the random number in A to the range 0-7, and CMP gov \ if A is less than government of this system, jump BCC MLOOP \ to MLOOP to stop spawning (so safer governments with \ larger gov numbers have a greater chance of jumping \ out, which is another way of saying that more \ dangerous systems spawn pirates and bounty hunters \ more often)
AND #7 \ Reduce the random number in A to the range 0-7, and CMP gov \ if A is less than government of this system, jump BCC MLOOPS \ to MLOOPS to stop spawning (so safer governments with \ larger gov numbers have a greater chance of jumping \ out, which is another way of saying that more \ dangerous systems spawn pirates and bounty hunters \ more often)
.LABEL_2

Code variation 9 of 23A variation in the labels only

This variation is blank in the Cassette, Disc (flight), Master and Electron versions.

\ In the 6502 Second Processor version, the LABEL_2 \ label is actually ` (a backtick), but that doesn't \ compile in BeebAsm and it's pretty cryptic, so \ instead this version sticks with the label LABEL_2 \ from the cassette version

Code variation 10 of 23A variation in the comments only

Tap on a block to expand it, and tap it again to revert.

\ Now to spawn a lone bounty hunter, a Thargoid or a \ group of pirates
\ Now to spawn a lone bounty hunter or a group of \ pirates
 JSR Ze                 \ Call Ze to initialise INWK to a potentially hostile
                        \ ship, and set A and X to random values
                        \
                        \ Note that because Ze uses the value of X returned by
                        \ DORND, and X contains the value of A returned by the
                        \ previous call to DORND, this does not set the new ship
                        \ to a totally random location. See the deep dive on
                        \ "Fixing ship positions" for details

Code variation 11 of 23Related to a standard feature

In the cassette version there's a 13% chance of spawning a group of pirates, while in the other versions there's a 61% chance.

Tap on a block to expand it, and tap it again to revert.

CMP #200 \ If the random number in A >= 200 (13% chance), jump BCS mt1 \ to mt1 to spawn pirates, otherwise keep going to \ spawn a lone bounty hunter or a Thargoid
CMP #100 \ If the random number in A >= 100 (61% chance), jump BCS mt1 \ to mt1 to spawn pirates, otherwise keep going to \ spawn a lone bounty hunter
CMP #100 \ If the random number in A >= 100 (61% chance), jump BCS mt1 \ to mt1 to spawn pirates, otherwise keep going to \ spawn a lone bounty hunter or a Thargoid
CMP #200 \ If the random number in A >= 200 (13% chance), jump BCS mt1 \ to mt1 to spawn pirates, otherwise keep going to \ spawn a lone bounty hunter
 INC EV                 \ Increase the extra vessels spawning counter, to
                        \ prevent the next attempt to spawn extra vessels

Code variation 12 of 23Related to an enhanced feature

In the enhanced versions, lone bounty hunters can be in a Cobra Mk III (pirate), Asp Mk II, Python (pirate) or Fer-de-lance, while in the cassette version they can be in a Mamba, Python or Cobra Mk III.

Tap on a block to expand it, and tap it again to revert.

AND #3 \ Set A = Y = random number in the range 3-6, which ADC #3 \ we will use to determine the type of ship TAY \ We now build the AI flag for this ship in A TXA \ First, copy the random number in X to A
AND #3 \ Set A = random number in the range 0-3, which we \ will now use to determine the type of ship ADC #CYL2 \ Add A to #CYL2 (we know the C flag is clear as we \ passed through the BCS above), so A is now one of the \ lone bounty hunter ships, i.e. Cobra Mk III (pirate), \ Asp Mk II, Python (pirate) or Fer-de-lance \ \ Interestingly, this logic means that the Moray, which \ is the ship after the Fer-de-lance in the XX21 table, \ never spawns, as the above logic chooses a blueprint \ number in the range CYL2 to CYL2+3 (i.e. 24 to 27), \ and the Moray is blueprint 28 \ \ No other code spawns the ship with blueprint 28, so \ this means the Moray is never seen in Elite \ \ This is presumably a bug, which could be very easily \ fixed by inserting one of the following instructions \ before the ADC #CYL2 instruction above: \ \ * SEC would change the range to 25 to 28, which \ would cover the Asp Mk II, Python (pirate), \ Fer-de-lance and Moray \ \ * LSR A would set the C flag to a random number to \ give a range of 24 to 28, which would cover the \ Cobra Mk III (pirate), Asp Mk II, Python (pirate), \ Fer-de-lance and Moray \ \ It's hard to know what the authors' original intent \ was, but the second approach makes the Moray and Cobra \ Mk III the rarest choices, with the Asp Mk II, Python \ and Fer-de-Lance being more likely, and as the Moray \ is described in the literature as a rare ship, and the \ Cobra can already be spawned as part of a group of \ pirates (see mt1 below), I tend to favour the LSR A \ solution over the SEC approach TAY \ Copy the new ship type to Y JSR THERE \ Call THERE to see if we are in the Constrictor's \ system in mission 1 BCC NOCON \ If the C flag is clear then we are not in the \ Constrictor's system, so skip to NOCON LDA #%11111001 \ Set the AI flag of this ship so that it has E.C.M., STA INWK+32 \ has a very high aggression level of 28 out of 31, is \ hostile, and has AI enabled - nasty stuff! LDA TP \ Fetch bits 0 and 1 of TP, which contain the status of AND #%00000011 \ mission 1 LSR A \ Shift bit 0 into the C flag BCC NOCON \ If bit 0 is clear, skip to NOCON as mission 1 is not \ in progress ORA MANY+CON \ Bit 0 of A now contains bit 1 of TP, so this will be \ set if we have already completed mission 1, so this OR \ will be non-zero if we have either completed mission \ 1, or there is already a Constrictor in our local \ bubble of universe (in which case MANY+CON will be \ non-zero) BEQ YESCON \ If A = 0 then mission 1 is in progress, we haven't \ completed it yet, and there is no Constrictor in the \ vicinity, so jump to YESCON to spawn the Constrictor .NOCON

Code variation 13 of 23Related to an advanced feature

In the advanced versions, lone bounty hunters are always spawned as hostile.

This variation is blank in the Cassette, Disc (flight) and Electron versions.

LDA #%00000100 \ Set bit 2 of the NEWB flags and clear all other bits, STA NEWB \ so the ship we are about to spawn is hostile \ We now build the AI flag for this ship in A JSR DORND \ Set A and X to random numbers

Code variation 14 of 23Related to a standard feature

Lone bounty hunters in the disc version don't have E.C.M., while in the other versions they have a 22% chance of having E.C.M.

This variation is blank in the Disc (flight) version.

CMP #200 \ First, set the C flag if X >= 200 (22% chance) ROL A \ Set bit 0 of A to the C flag (i.e. there's a 22% \ chance of this ship having E.C.M.) ORA #%11000000 \ Set bits 6 and 7 of A, so the ship is hostile (bit 6) \ and has AI (bit 7)

Code variation 15 of 23Specific to an individual platform

This variation is blank in the Disc (flight), 6502 Second Processor, Master and Electron versions.

CPY #6 \ If Y = 6 (i.e. a Thargoid), jump down to the tha BEQ tha \ routine in part 6 to decide whether or not to spawn it \ (where there's a 22% chance of this happening)

Code variation 16 of 23Specific to an individual platform

This variation is blank in the Disc (flight) version.

Tap on a block to expand it, and tap it again to revert.

STA INWK+32 \ Store A in the AI flag of this ship TYA \ Add a new ship of type Y to the local bubble, so JSR NWSHP \ that's a Mamba, Cobra Mk III or Python
STA INWK+32 \ Store A in the AI flag of this ship

Code variation 17 of 23Related to an enhanced feature

The Constrictor only spawns in its home system, during the mission 1 endgame, and then it only spawns once... though it can still appear in the ship hangar from time to time.

This variation is blank in the Cassette and Electron versions.

TYA \ Set A to the new ship type in Y EQUB &2C \ Skip the next instruction by turning it into \ &2C &A9 &1F, or BIT &1FA9, which does nothing apart \ from affect the flags .YESCON LDA #CON \ If we jump straight here, we are in the mission 1 \ endgame and it's time to spawn the Constrictor, so \ set A to the Constrictor's type .focoug

Code variation 18 of 23A variation in the comments only

This variation is blank in the Cassette and Electron versions.

Tap on a block to expand it, and tap it again to revert.

JSR NWSHP \ Spawn the new ship, whether it's a pirate or \ Constrictor
JSR NWSHP \ Spawn the new ship, whether it's a pirate, Thargoid, \ Cougar or Constrictor
.mj1

 JMP MLOOP              \ Jump down to MLOOP, as we are done spawning ships

Code variation 19 of 23Related to an advanced feature

When considering spawning a Cougar or a Thargoid instead of a cop, the advanced versions spawn a Thargoid 96.8% of the time, and a Cougar 3.2% of the time.

This variation is blank in the Cassette, Disc (flight) and Electron versions.

.fothg LDA K%+6 \ Fetch the z_lo coordinate of the first ship in the K% AND #%00111110 \ block (i.e. the planet) and extract bits 1-5 BNE fothg2 \ If any of bits 1-5 are set (96.8% chance), jump up to \ fothg2 to spawn a Thargoid \ If we get here then we're going to spawn a Cougar, a \ very rare event indeed. How rare? Well, all the \ following have to happen in sequence: \ \ * Main loop iteration = 0 (1 in 256 iterations) \ * Skip asteroid spawning (87% chance) \ * Skip cop spawning (0.4% chance) \ * Skip Thargoid spawning (3.2% chance) \ \ so the chances of spawning a Cougar on any single main \ loop iteration are slim, to say the least LDA #18 \ Give the ship we're about to spawn a speed of 27 STA INWK+27 LDA #%01111001 \ Give it an E.C.M., and make it hostile and pretty STA INWK+32 \ aggressive (though don't give it AI) LDA #COU \ Set the ship type to a Cougar and jump up to focoug BNE focoug \ to spawn it
.mt1

 AND #3                 \ It's time to spawn a group of pirates, so set A to a
                        \ random number in the range 0-3, which will be the
                        \ loop counter for spawning pirates below (so we will
                        \ spawn 1-4 pirates)

 STA EV                 \ Delay further spawnings by this number

 STA XX13               \ Store the number in XX13, the pirate counter

.mt3

 JSR DORND              \ Set A and X to random numbers

Code variation 20 of 23Related to an enhanced feature

When spawning a pack of pirates in the enhanced versions, the chances of each ship type appearing in the pack are slightly different, with the most likely candidates appearing first in this list: Sidewinder, Mamba, Krait, Adder, Gecko, Cobra Mk I, Worm or Cobra Mk III (pirate).

Tap on a block to expand it, and tap it again to revert.

AND #3 \ Set A to a random number in the range 0-3 ORA #1 \ Set A to %01 or %11 (Sidewinder or Mamba)
STA T \ Set T to a random number JSR DORND \ Set A and X to random numbers AND T \ Set A to the AND of two random numbers, so each bit \ has 25% chance of being set which makes the chances \ of a smaller number higher AND #7 \ Reduce A to a random number in the range 0-7, though \ with a bigger chance of a smaller number in this range

Code variation 21 of 23Specific to an individual platform

This variation is blank in the Cassette, 6502 Second Processor, Master and Electron versions.

STA CPIR \ Set CPIR to this random number in the range 0-7 .more LDA CPIR \ Set A to the ship type in CPIR

Code variation 22 of 23Related to an enhanced feature

In the enhanced versions, a pack-hunting pirate will fly a Sidewinder, Mamba, Krait, Adder, Gecko, Cobra Mk I, Worm or Cobra Mk III (pirate), while in the cassette version you'll only find them in the cockpit of a Sidewinder or Mamba.

This variation is blank in the Cassette and Electron versions.

ADC #PACK \ #PACK is set to #SH3, the ship type for a Sidewinder, \ so this sets our new ship type to one of the pack \ hunters, namely a Sidewinder, Mamba, Krait, Adder, \ Gecko, Cobra Mk I, Worm or Cobra Mk III (pirate)
 JSR NWSHP              \ Try adding a new ship of type A to the local bubble

Code variation 23 of 23Specific to an individual platform

This variation is blank in the Cassette, 6502 Second Processor, Master and Electron versions.

BCS P%+7 \ If the ship was successfully added, skip the following \ two instructions DEC CPIR \ The ship wasn't added, which might be because the ship \ blueprint for this ship type isn't in the currently \ loaded ship blueprints file, so decrement CPIR to \ point to the previous ship type, so we can try \ spawning that type of pirate instead BPL more \ Loop back to more to have another go at spawning this \ pirate, until we have tried spawning a Sidewinder when \ CPIR is 0, in which case give up and move on to the \ next pirate to spawn
 DEC XX13               \ Decrement the pirate counter

 BPL mt3                \ If we need more pirates, loop back up to mt3,
                        \ otherwise we are done spawning, so fall through into
                        \ the end of the main loop at MLOOP