Skip to navigation

Elite on the BBC Micro and NES

Bank 1 (Part 1 of 3)

[NES version]

NES ELITE GAME SOURCE (BANK 1) NES Elite was written by Ian Bell and David Braben and is copyright D. Braben and I. Bell 1991/1992 The code on this site has been reconstructed from a disassembly of the version released on Ian Bell's personal website at http://www.elitehomepage.org/ The commentary is copyright Mark Moxon, and any misunderstandings or mistakes in the documentation are entirely my fault The terminology and notations used in this commentary are explained at https://www.bbcelite.com/terminology The deep dive articles referred to in this commentary can be found at https://www.bbcelite.com/deep_dives
This source file produces the following binary file: * bank1.bin
ELITE BANK 1 Produces the binary file bank1.bin.
ORG CODE%
Name: ResetMMC1_b1 [Show more] Type: Subroutine Category: Start and end Summary: The MMC1 mapper reset routine at the start of the ROM bank Deep dive: Splitting NES Elite across multiple ROM banks
Context: See this subroutine on its own page References: This subroutine is called as follows: * Vectors_b1 calls ResetMMC1_b1

When the NES is switched on, it is hardwired to perform a JMP ($FFFC). At this point, there is no guarantee as to which ROM banks are mapped to $8000 and $C000, so to ensure that the game starts up correctly, we put the same code in each ROM at the following locations: * We put $C000 in address $FFFC in every ROM bank, so the NES always jumps to $C000 when it starts up via the JMP ($FFFC), irrespective of which ROM bank is mapped to $C000. * We put the same reset routine (this routine, ResetMMC1) at the start of every ROM bank, so the same routine gets run, whichever ROM bank is mapped to $C000. This ResetMMC1 routine is therefore called when the NES starts up, whatever the bank configuration ends up being. It then switches ROM bank 7 to $C000 and jumps into bank 7 at the game's entry point BEGIN, which starts the game.
.ResetMMC1_b1 SEI ; Disable interrupts INC $C006 ; Reset the MMC1 mapper, which we can do by writing a ; value with bit 7 set into any address in ROM space ; (i.e. any address from $8000 to $FFFF) ; ; The INC instruction does this in a more efficient ; manner than an LDA/STA pair, as it: ; ; * Fetches the contents of address $C006, which ; contains the high byte of the JMP destination ; below, i.e. the high byte of BEGIN, which is $C0 ; ; * Adds 1, to give $C1 ; ; * Writes the value $C1 back to address $C006 ; ; $C006 is in the ROM space and $C1 has bit 7 set, so ; the INC does all that is required to reset the mapper, ; in fewer cycles and bytes than an LDA/STA pair ; ; Resetting MMC1 maps bank 7 to $C000 and enables the ; bank at $8000 to be switched, so this instruction ; ensures that bank 7 is present JMP BEGIN ; Jump to BEGIN in bank 7 to start the game
Name: Interrupts_b1 [Show more] Type: Subroutine Category: Start and end Summary: The IRQ and NMI handler while the MMC1 mapper reset routine is still running
Context: See this subroutine on its own page References: This subroutine is called as follows: * Vectors_b1 calls Interrupts_b1
.Interrupts_b1 IF _NTSC RTI ; Return from the IRQ interrupt without doing anything ; ; This ensures that while the system is starting up and ; the ROM banks are in an unknown configuration, any IRQ ; interrupts that go via the vector at $FFFE and any NMI ; interrupts that go via the vector at $FFFA will end up ; here and be dealt with ; ; Once bank 7 is switched into $C000 by the ResetMMC1 ; routine, the vector is overwritten with the last two ; bytes of bank 7, which point to the IRQ routine ENDIF
Name: versionNumber_b1 [Show more] Type: Variable Category: Text Summary: The game's version number in bank 1
Context: See this variable on its own page References: No direct references to this variable in this source file
IF _NTSC EQUS " 5.0" ELIF _PAL EQUS "<2.8>" ENDIF
Name: Unused copy of XX21 [Show more] Type: Variable Category: Drawing ships Summary: Remnants of an unused copy of the XX21 ship blueprints lookup table
Context: See this variable on its own page References: No direct references to this variable in this source file
EQUW SHIP_ASTEROID ; These bytes appear to be unused EQUW SHIP_SPLINTER ; EQUW SHIP_SHUTTLE ; This is a truncated copy of XX21, the table of ship EQUW SHIP_TRANSPORTER ; blueprint addresses. This version only contains the EQUW SHIP_COBRA_MK_3 ; asteroid onwards, and it is not used anywhere, so it EQUW SHIP_PYTHON ; looks like this is all that remains of a copy of XX21 EQUW SHIP_BOA ; that was assembled at address $8000, and then EQUW SHIP_ANACONDA ; partially overwritten EQUW SHIP_ROCK_HERMIT EQUW SHIP_VIPER EQUW SHIP_SIDEWINDER EQUW SHIP_MAMBA EQUW SHIP_KRAIT EQUW SHIP_ADDER EQUW SHIP_GECKO EQUW SHIP_COBRA_MK_1 EQUW SHIP_WORM EQUW SHIP_COBRA_MK_3_P EQUW SHIP_ASP_MK_2 EQUW SHIP_PYTHON_P EQUW SHIP_FER_DE_LANCE EQUW SHIP_MORAY EQUW SHIP_THARGOID EQUW SHIP_THARGON EQUW SHIP_CONSTRICTOR EQUW SHIP_COUGAR EQUW SHIP_DODO
Name: E% [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprints default NEWB flags Deep dive: Ship blueprints Advanced tactics with the NEWB flags
Context: See this variable on its own page References: This variable is used as follows: * GetDefaultNEWB uses E%

When spawning a new ship, the bits from this table are applied to the new ship's NEWB flags in byte #36 (i.e. a set bit in this table will set that bit in the NEWB flags). In other words, if a ship blueprint is set to one of the following, then all spawned ships of that type will be too: trader, bounty hunter, hostile, pirate, innocent, cop. The NEWB flags are as follows: * Bit 0: Trader flag (0 = not a trader, 1 = trader) * Bit 1: Bounty hunter flag (0 = not a bounty hunter, 1 = bounty hunter) * Bit 2: Hostile flag (0 = not hostile, 1 = hostile) * Bit 3: Pirate flag (0 = not a pirate, 1 = pirate) * Bit 4: Docking flag (0 = not docking, 1 = docking) * Bit 5: Innocent bystander (0 = normal, 1 = innocent bystander) * Bit 6: Cop flag (0 = not a cop, 1 = cop) * Bit 7: For spawned ships: ship been scooped or has docked For blueprints: this ship type has an escape pod fitted See the deep dive on "Advanced tactics with the NEWB flags" for details of how this works.
.E% EQUB %00000000 ; Missile EQUB %00000000 ; Coriolis space station EQUB %00000001 ; Escape pod Trader EQUB %00000000 ; Alloy plate EQUB %00000000 ; Cargo canister EQUB %00000000 ; Boulder EQUB %00000000 ; Asteroid EQUB %00000000 ; Splinter EQUB %00100001 ; Shuttle Trader, innocent EQUB %01100001 ; Transporter Trader, innocent, cop EQUB %10100000 ; Cobra Mk III Innocent, escape pod EQUB %10100000 ; Python Innocent, escape pod EQUB %10100000 ; Boa Innocent, escape pod EQUB %10100001 ; Anaconda Trader, innocent, escape pod EQUB %10100001 ; Rock hermit (asteroid) Trader, innocent, escape pod EQUB %11000010 ; Viper Bounty hunter, cop, escape pod EQUB %00001100 ; Sidewinder Hostile, pirate EQUB %10001100 ; Mamba Hostile, pirate, escape pod EQUB %10001100 ; Krait Hostile, pirate, escape pod EQUB %10001100 ; Adder Hostile, pirate, escape pod EQUB %00001100 ; Gecko Hostile, pirate EQUB %10001100 ; Cobra Mk I Hostile, pirate, escape pod EQUB %00000101 ; Worm Hostile, trader EQUB %10001100 ; Cobra Mk III (pirate) Hostile, pirate, escape pod EQUB %10001100 ; Asp Mk II Hostile, pirate, escape pod EQUB %10001100 ; Python (pirate) Hostile, pirate, escape pod EQUB %10000010 ; Fer-de-lance Bounty hunter, escape pod EQUB %00001100 ; Moray Hostile, pirate EQUB %00001100 ; Thargoid Hostile, pirate EQUB %00000100 ; Thargon Hostile EQUB %00000100 ; Constrictor Hostile EQUB %00100000 ; Cougar Innocent EQUB 0 ; This byte appears to be unused
Name: KWL% [Show more] Type: Variable Category: Status Summary: Fractional number of kills awarded for destroying each type of ship
Context: See this variable on its own page References: This variable is used as follows: * IncreaseTally uses KWL%

This figure contains the fractional part of the points that are added to the combat rank in TALLY when destroying a ship of this type. This is different to the original BBC Micro versions, where you always get a single combat point for everything you kill; in the Master version, it's more sophisticated. The integral part is stored in the KWH% table. Each fraction is stored as the numerator in a fraction with a denominator of 256, so 149 represents 149 / 256 = 0.58203125 points. Note that in the NES version, the kill count is doubled before it is added to the kill tally.
.KWL% EQUB 149 ; Missile 0.58203125 EQUB 0 ; Coriolis space station 0.0 EQUB 16 ; Escape pod 0.0625 EQUB 10 ; Alloy plate 0.0390625 EQUB 10 ; Cargo canister 0.0390625 EQUB 6 ; Boulder 0.0234375 EQUB 8 ; Asteroid 0.03125 EQUB 10 ; Splinter 0.0390625 EQUB 16 ; Shuttle 0.0625 EQUB 17 ; Transporter 0.06640625 EQUB 234 ; Cobra Mk III 0.9140625 EQUB 170 ; Python 0.6640625 EQUB 213 ; Boa 0.83203125 EQUB 0 ; Anaconda 1.0 EQUB 85 ; Rock hermit (asteroid) 0.33203125 EQUB 26 ; Viper 0.1015625 EQUB 85 ; Sidewinder 0.33203125 EQUB 128 ; Mamba 0.5 EQUB 85 ; Krait 0.33203125 EQUB 90 ; Adder 0.3515625 EQUB 85 ; Gecko 0.33203125 EQUB 170 ; Cobra Mk I 0.6640625 EQUB 50 ; Worm 0.1953125 EQUB 42 ; Cobra Mk III (pirate) 1.1640625 EQUB 21 ; Asp Mk II 1.08203125 EQUB 42 ; Python (pirate) 1.1640625 EQUB 64 ; Fer-de-lance 1.25 EQUB 192 ; Moray 0.75 EQUB 170 ; Thargoid 2.6640625 EQUB 33 ; Thargon 0.12890625 EQUB 85 ; Constrictor 5.33203125 EQUB 85 ; Cougar 5.33203125 EQUB 0 ; Dodecahedron ("Dodo") space station 0.0
Name: KWH% [Show more] Type: Variable Category: Status Summary: Integer number of kills awarded for destroying each type of ship
Context: See this variable on its own page References: This variable is used as follows: * IncreaseTally uses KWH%

This figure contains the integer part of the points that are added to the combat rank in TALLY when destroying a ship of this type. This is different to the original BBC Micro versions, where you always get a single combat point for everything you kill; in the Master version, it's more sophisticated. The fractional part is stored in the KWL% table. Note that in the NES version, the kill count is doubled before it is added to the kill tally.
.KWH% EQUB 0 ; Missile 0.58203125 EQUB 0 ; Coriolis space station 0.0 EQUB 0 ; Escape pod 0.0625 EQUB 0 ; Alloy plate 0.0390625 EQUB 0 ; Cargo canister 0.0390625 EQUB 0 ; Boulder 0.0234375 EQUB 0 ; Asteroid 0.03125 EQUB 0 ; Splinter 0.0390625 EQUB 0 ; Shuttle 0.0625 EQUB 0 ; Transporter 0.06640625 EQUB 0 ; Cobra Mk III 0.9140625 EQUB 0 ; Python 0.6640625 EQUB 0 ; Boa 0.83203125 EQUB 1 ; Anaconda 1.0 EQUB 0 ; Rock hermit (asteroid) 0.33203125 EQUB 0 ; Viper 0.1015625 EQUB 0 ; Sidewinder 0.33203125 EQUB 0 ; Mamba 0.5 EQUB 0 ; Krait 0.33203125 EQUB 0 ; Adder 0.3515625 EQUB 0 ; Gecko 0.33203125 EQUB 0 ; Cobra Mk I 0.6640625 EQUB 0 ; Worm 0.1953125 EQUB 1 ; Cobra Mk III (pirate) 1.1640625 EQUB 1 ; Asp Mk II 1.08203125 EQUB 1 ; Python (pirate) 1.1640625 EQUB 1 ; Fer-de-lance 1.25 EQUB 0 ; Moray 0.75 EQUB 2 ; Thargoid 2.6640625 EQUB 0 ; Thargon 0.12890625 EQUB 5 ; Constrictor 5.33203125 EQUB 5 ; Cougar 5.33203125 EQUB 0 ; Dodecahedron ("Dodo") space station 0.0
Name: SHIP_MISSILE [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a missile Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * XX21 uses SHIP_MISSILE
.SHIP_MISSILE EQUB 0 ; Max. canisters on demise = 0 EQUW 40 * 40 ; Targetable area = 40 * 40 EQUB LO(SHIP_MISSILE_EDGES - SHIP_MISSILE) ; Edges data offset (low) EQUB LO(SHIP_MISSILE_FACES - SHIP_MISSILE) ; Faces data offset (low) EQUB 85 ; Max. edge count = (85 - 1) / 4 = 21 EQUB 0 ; Gun vertex = 0 EQUB 10 ; Explosion count = 1, as (4 * n) + 6 = 10 EQUB 102 ; Number of vertices = 102 / 6 = 17 EQUB 24 ; Number of edges = 24 EQUW 0 ; Bounty = 0 EQUB 36 ; Number of faces = 36 / 4 = 9 EQUB 14 ; Visibility distance = 14 EQUB 2 ; Max. energy = 2 EQUB 44 ; Max. speed = 44 EQUB HI(SHIP_MISSILE_EDGES - SHIP_MISSILE) ; Edges data offset (high) EQUB HI(SHIP_MISSILE_FACES - SHIP_MISSILE) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_MISSILE_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 0, 68, 0, 1, 2, 3, 31 ; Vertex 0 VERTEX 8, -8, 36, 1, 2, 4, 5, 31 ; Vertex 1 VERTEX 8, 8, 36, 2, 3, 4, 7, 31 ; Vertex 2 VERTEX -8, 8, 36, 0, 3, 6, 7, 31 ; Vertex 3 VERTEX -8, -8, 36, 0, 1, 5, 6, 31 ; Vertex 4 VERTEX 8, 8, -44, 4, 7, 8, 8, 31 ; Vertex 5 VERTEX 8, -8, -44, 4, 5, 8, 8, 31 ; Vertex 6 VERTEX -8, -8, -44, 5, 6, 8, 8, 31 ; Vertex 7 VERTEX -8, 8, -44, 6, 7, 8, 8, 31 ; Vertex 8 VERTEX 12, 12, -44, 4, 7, 8, 8, 8 ; Vertex 9 VERTEX 12, -12, -44, 4, 5, 8, 8, 8 ; Vertex 10 VERTEX -12, -12, -44, 5, 6, 8, 8, 8 ; Vertex 11 VERTEX -12, 12, -44, 6, 7, 8, 8, 8 ; Vertex 12 VERTEX -8, 8, -12, 6, 7, 7, 7, 8 ; Vertex 13 VERTEX -8, -8, -12, 5, 6, 6, 6, 8 ; Vertex 14 VERTEX 8, 8, -12, 4, 7, 7, 7, 8 ; Vertex 15 VERTEX 8, -8, -12, 4, 5, 5, 5, 8 ; Vertex 16 .SHIP_MISSILE_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 1, 2, 31 ; Edge 0 EDGE 0, 2, 2, 3, 31 ; Edge 1 EDGE 0, 3, 0, 3, 31 ; Edge 2 EDGE 0, 4, 0, 1, 31 ; Edge 3 EDGE 1, 2, 4, 2, 31 ; Edge 4 EDGE 1, 4, 1, 5, 31 ; Edge 5 EDGE 3, 4, 0, 6, 31 ; Edge 6 EDGE 2, 3, 3, 7, 31 ; Edge 7 EDGE 2, 5, 4, 7, 31 ; Edge 8 EDGE 1, 6, 4, 5, 31 ; Edge 9 EDGE 4, 7, 5, 6, 31 ; Edge 10 EDGE 3, 8, 6, 7, 31 ; Edge 11 EDGE 7, 8, 6, 8, 31 ; Edge 12 EDGE 5, 8, 7, 8, 31 ; Edge 13 EDGE 5, 6, 4, 8, 31 ; Edge 14 EDGE 6, 7, 5, 8, 31 ; Edge 15 EDGE 6, 10, 5, 8, 8 ; Edge 16 EDGE 5, 9, 7, 8, 8 ; Edge 17 EDGE 8, 12, 7, 8, 8 ; Edge 18 EDGE 7, 11, 5, 8, 8 ; Edge 19 EDGE 9, 15, 4, 7, 8 ; Edge 20 EDGE 10, 16, 4, 5, 8 ; Edge 21 EDGE 12, 13, 6, 7, 8 ; Edge 22 EDGE 11, 14, 5, 6, 8 ; Edge 23 .SHIP_MISSILE_FACES ; normal_x, normal_y, normal_z, visibility FACE -64, 0, 16, 31 ; Face 0 FACE 0, -64, 16, 31 ; Face 1 FACE 64, 0, 16, 31 ; Face 2 FACE 0, 64, 16, 31 ; Face 3 FACE 32, 0, 0, 31 ; Face 4 FACE 0, -32, 0, 31 ; Face 5 FACE -32, 0, 0, 31 ; Face 6 FACE 0, 32, 0, 31 ; Face 7 FACE 0, 0, -176, 31 ; Face 8
Name: SHIP_CORIOLIS [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Coriolis space station Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * XX21 uses SHIP_CORIOLIS
.SHIP_CORIOLIS EQUB 0 ; Max. canisters on demise = 0 EQUW 160 * 160 ; Targetable area = 160 * 160 EQUB LO(SHIP_CORIOLIS_EDGES - SHIP_CORIOLIS) ; Edges data offset (low) EQUB LO(SHIP_CORIOLIS_FACES - SHIP_CORIOLIS) ; Faces data offset (low) EQUB 89 ; Max. edge count = (89 - 1) / 4 = 22 EQUB 0 ; Gun vertex = 0 EQUB 6 ; Explosion count = 0, as (4 * n) + 6 = 6 EQUB 96 ; Number of vertices = 96 / 6 = 16 EQUB 28 ; Number of edges = 28 EQUW 0 ; Bounty = 0 EQUB 56 ; Number of faces = 56 / 4 = 14 EQUB 120 ; Visibility distance = 120 EQUB 240 ; Max. energy = 240 EQUB 0 ; Max. speed = 0 EQUB HI(SHIP_CORIOLIS_EDGES - SHIP_CORIOLIS) ; Edges data offset (high) EQUB HI(SHIP_CORIOLIS_FACES - SHIP_CORIOLIS) ; Faces data offset (high) EQUB 0 ; Normals are scaled by = 2^0 = 1 EQUB %00000110 ; Laser power = 0 ; Missiles = 6 .SHIP_CORIOLIS_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 160, 0, 160, 0, 1, 2, 6, 31 ; Vertex 0 VERTEX 0, 160, 160, 0, 2, 3, 8, 31 ; Vertex 1 VERTEX -160, 0, 160, 0, 3, 4, 7, 31 ; Vertex 2 VERTEX 0, -160, 160, 0, 1, 4, 5, 31 ; Vertex 3 VERTEX 160, -160, 0, 1, 5, 6, 10, 31 ; Vertex 4 VERTEX 160, 160, 0, 2, 6, 8, 11, 31 ; Vertex 5 VERTEX -160, 160, 0, 3, 7, 8, 12, 31 ; Vertex 6 VERTEX -160, -160, 0, 4, 5, 7, 9, 31 ; Vertex 7 VERTEX 160, 0, -160, 6, 10, 11, 13, 31 ; Vertex 8 VERTEX 0, 160, -160, 8, 11, 12, 13, 31 ; Vertex 9 VERTEX -160, 0, -160, 7, 9, 12, 13, 31 ; Vertex 10 VERTEX 0, -160, -160, 5, 9, 10, 13, 31 ; Vertex 11 VERTEX 10, -30, 160, 0, 0, 0, 0, 30 ; Vertex 12 VERTEX 10, 30, 160, 0, 0, 0, 0, 30 ; Vertex 13 VERTEX -10, 30, 160, 0, 0, 0, 0, 30 ; Vertex 14 VERTEX -10, -30, 160, 0, 0, 0, 0, 30 ; Vertex 15 .SHIP_CORIOLIS_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 3, 0, 1, 31 ; Edge 0 EDGE 0, 1, 0, 2, 31 ; Edge 1 EDGE 1, 2, 0, 3, 31 ; Edge 2 EDGE 2, 3, 0, 4, 31 ; Edge 3 EDGE 3, 4, 1, 5, 31 ; Edge 4 EDGE 0, 4, 1, 6, 31 ; Edge 5 EDGE 0, 5, 2, 6, 31 ; Edge 6 EDGE 5, 1, 2, 8, 31 ; Edge 7 EDGE 1, 6, 3, 8, 31 ; Edge 8 EDGE 2, 6, 3, 7, 31 ; Edge 9 EDGE 2, 7, 4, 7, 31 ; Edge 10 EDGE 3, 7, 4, 5, 31 ; Edge 11 EDGE 8, 11, 10, 13, 31 ; Edge 12 EDGE 8, 9, 11, 13, 31 ; Edge 13 EDGE 9, 10, 12, 13, 31 ; Edge 14 EDGE 10, 11, 9, 13, 31 ; Edge 15 EDGE 4, 11, 5, 10, 31 ; Edge 16 EDGE 4, 8, 6, 10, 31 ; Edge 17 EDGE 5, 8, 6, 11, 31 ; Edge 18 EDGE 5, 9, 8, 11, 31 ; Edge 19 EDGE 6, 9, 8, 12, 31 ; Edge 20 EDGE 6, 10, 7, 12, 31 ; Edge 21 EDGE 7, 10, 7, 9, 31 ; Edge 22 EDGE 7, 11, 5, 9, 31 ; Edge 23 EDGE 12, 13, 0, 0, 30 ; Edge 24 EDGE 13, 14, 0, 0, 30 ; Edge 25 EDGE 14, 15, 0, 0, 30 ; Edge 26 EDGE 15, 12, 0, 0, 30 ; Edge 27 .SHIP_CORIOLIS_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 0, 160, 31 ; Face 0 FACE 107, -107, 107, 31 ; Face 1 FACE 107, 107, 107, 31 ; Face 2 FACE -107, 107, 107, 31 ; Face 3 FACE -107, -107, 107, 31 ; Face 4 FACE 0, -160, 0, 31 ; Face 5 FACE 160, 0, 0, 31 ; Face 6 FACE -160, 0, 0, 31 ; Face 7 FACE 0, 160, 0, 31 ; Face 8 FACE -107, -107, -107, 31 ; Face 9 FACE 107, -107, -107, 31 ; Face 10 FACE 107, 107, -107, 31 ; Face 11 FACE -107, 107, -107, 31 ; Face 12 FACE 0, 0, -160, 31 ; Face 13
Name: SHIP_ESCAPE_POD [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for an escape pod Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * XX21 uses SHIP_ESCAPE_POD
.SHIP_ESCAPE_POD EQUB 0 + (2 << 4) ; Max. canisters on demise = 0 ; Market item when scooped = 2 + 1 = 3 (slaves) EQUW 16 * 16 ; Targetable area = 16 * 16 EQUB LO(SHIP_ESCAPE_POD_EDGES - SHIP_ESCAPE_POD) ; Edges data offset (low) EQUB LO(SHIP_ESCAPE_POD_FACES - SHIP_ESCAPE_POD) ; Faces data offset (low) EQUB 29 ; Max. edge count = (29 - 1) / 4 = 7 EQUB 0 ; Gun vertex = 0 EQUB 22 ; Explosion count = 4, as (4 * n) + 6 = 22 EQUB 24 ; Number of vertices = 24 / 6 = 4 EQUB 6 ; Number of edges = 6 EQUW 0 ; Bounty = 0 EQUB 16 ; Number of faces = 16 / 4 = 4 EQUB 8 ; Visibility distance = 8 EQUB 17 ; Max. energy = 17 EQUB 8 ; Max. speed = 8 EQUB HI(SHIP_ESCAPE_POD_EDGES - SHIP_ESCAPE_POD) ; Edges data offset (high) EQUB HI(SHIP_ESCAPE_POD_FACES - SHIP_ESCAPE_POD) ; Faces data offset (high) EQUB 4 ; Normals are scaled by = 2^4 = 16 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_ESCAPE_POD_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -7, 0, 36, 2, 1, 3, 3, 31 ; Vertex 0 VERTEX -7, -14, -12, 2, 0, 3, 3, 31 ; Vertex 1 VERTEX -7, 14, -12, 1, 0, 3, 3, 31 ; Vertex 2 VERTEX 21, 0, 0, 1, 0, 2, 2, 31 ; Vertex 3 .SHIP_ESCAPE_POD_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 3, 2, 31 ; Edge 0 EDGE 1, 2, 3, 0, 31 ; Edge 1 EDGE 2, 3, 1, 0, 31 ; Edge 2 EDGE 3, 0, 2, 1, 31 ; Edge 3 EDGE 0, 2, 3, 1, 31 ; Edge 4 EDGE 3, 1, 2, 0, 31 ; Edge 5 .SHIP_ESCAPE_POD_FACES ; normal_x, normal_y, normal_z, visibility FACE 52, 0, -122, 31 ; Face 0 FACE 39, 103, 30, 31 ; Face 1 FACE 39, -103, 30, 31 ; Face 2 FACE -112, 0, 0, 31 ; Face 3
Name: SHIP_PLATE [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for an alloy plate Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * XX21 uses SHIP_PLATE
.SHIP_PLATE EQUB 0 + (8 << 4) ; Max. canisters on demise = 0 ; Market item when scooped = 8 + 1 = 9 (Alloys) EQUW 10 * 10 ; Targetable area = 10 * 10 EQUB LO(SHIP_PLATE_EDGES - SHIP_PLATE) ; Edges data offset (low) EQUB LO(SHIP_PLATE_FACES - SHIP_PLATE) ; Faces data offset (low) EQUB 21 ; Max. edge count = (21 - 1) / 4 = 5 EQUB 0 ; Gun vertex = 0 EQUB 10 ; Explosion count = 1, as (4 * n) + 6 = 10 EQUB 24 ; Number of vertices = 24 / 6 = 4 EQUB 4 ; Number of edges = 4 EQUW 0 ; Bounty = 0 EQUB 4 ; Number of faces = 4 / 4 = 1 EQUB 5 ; Visibility distance = 5 EQUB 16 ; Max. energy = 16 EQUB 16 ; Max. speed = 16 EQUB HI(SHIP_PLATE_EDGES - SHIP_PLATE) ; Edges data offset (high) EQUB HI(SHIP_PLATE_FACES - SHIP_PLATE) ; Faces data offset (high) EQUB 3 ; Normals are scaled by = 2^3 = 8 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_PLATE_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -15, -22, -9, 15, 15, 15, 15, 31 ; Vertex 0 VERTEX -15, 38, -9, 15, 15, 15, 15, 31 ; Vertex 1 VERTEX 19, 32, 11, 15, 15, 15, 15, 20 ; Vertex 2 VERTEX 10, -46, 6, 15, 15, 15, 15, 20 ; Vertex 3 .SHIP_PLATE_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 15, 15, 31 ; Edge 0 EDGE 1, 2, 15, 15, 16 ; Edge 1 EDGE 2, 3, 15, 15, 20 ; Edge 2 EDGE 3, 0, 15, 15, 16 ; Edge 3 .SHIP_PLATE_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 0, 0, 0 ; Face 0
Name: SHIP_CANISTER [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a cargo canister Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * XX21 uses SHIP_CANISTER
.SHIP_CANISTER EQUB 0 ; Max. canisters on demise = 0 EQUW 20 * 20 ; Targetable area = 20 * 20 EQUB LO(SHIP_CANISTER_EDGES - SHIP_CANISTER) ; Edges data offset (low) EQUB LO(SHIP_CANISTER_FACES - SHIP_CANISTER) ; Faces data offset (low) EQUB 53 ; Max. edge count = (53 - 1) / 4 = 13 EQUB 0 ; Gun vertex = 0 EQUB 18 ; Explosion count = 3, as (4 * n) + 6 = 18 EQUB 60 ; Number of vertices = 60 / 6 = 10 EQUB 15 ; Number of edges = 15 EQUW 0 ; Bounty = 0 EQUB 28 ; Number of faces = 28 / 4 = 7 EQUB 12 ; Visibility distance = 12 EQUB 17 ; Max. energy = 17 EQUB 15 ; Max. speed = 15 EQUB HI(SHIP_CANISTER_EDGES - SHIP_CANISTER) ; Edges data offset (high) EQUB HI(SHIP_CANISTER_FACES - SHIP_CANISTER) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_CANISTER_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 24, 16, 0, 0, 1, 5, 5, 31 ; Vertex 0 VERTEX 24, 5, 15, 0, 1, 2, 2, 31 ; Vertex 1 VERTEX 24, -13, 9, 0, 2, 3, 3, 31 ; Vertex 2 VERTEX 24, -13, -9, 0, 3, 4, 4, 31 ; Vertex 3 VERTEX 24, 5, -15, 0, 4, 5, 5, 31 ; Vertex 4 VERTEX -24, 16, 0, 1, 5, 6, 6, 31 ; Vertex 5 VERTEX -24, 5, 15, 1, 2, 6, 6, 31 ; Vertex 6 VERTEX -24, -13, 9, 2, 3, 6, 6, 31 ; Vertex 7 VERTEX -24, -13, -9, 3, 4, 6, 6, 31 ; Vertex 8 VERTEX -24, 5, -15, 4, 5, 6, 6, 31 ; Vertex 9 .SHIP_CANISTER_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 0, 1, 31 ; Edge 0 EDGE 1, 2, 0, 2, 31 ; Edge 1 EDGE 2, 3, 0, 3, 31 ; Edge 2 EDGE 3, 4, 0, 4, 31 ; Edge 3 EDGE 0, 4, 0, 5, 31 ; Edge 4 EDGE 0, 5, 1, 5, 31 ; Edge 5 EDGE 1, 6, 1, 2, 31 ; Edge 6 EDGE 2, 7, 2, 3, 31 ; Edge 7 EDGE 3, 8, 3, 4, 31 ; Edge 8 EDGE 4, 9, 4, 5, 31 ; Edge 9 EDGE 5, 6, 1, 6, 31 ; Edge 10 EDGE 6, 7, 2, 6, 31 ; Edge 11 EDGE 7, 8, 3, 6, 31 ; Edge 12 EDGE 8, 9, 4, 6, 31 ; Edge 13 EDGE 9, 5, 5, 6, 31 ; Edge 14 .SHIP_CANISTER_FACES ; normal_x, normal_y, normal_z, visibility FACE 96, 0, 0, 31 ; Face 0 FACE 0, 41, 30, 31 ; Face 1 FACE 0, -18, 48, 31 ; Face 2 FACE 0, -51, 0, 31 ; Face 3 FACE 0, -18, -48, 31 ; Face 4 FACE 0, 41, -30, 31 ; Face 5 FACE -96, 0, 0, 31 ; Face 6
Name: SHIP_BOULDER [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a boulder Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * XX21 uses SHIP_BOULDER
.SHIP_BOULDER EQUB 0 ; Max. canisters on demise = 0 EQUW 30 * 30 ; Targetable area = 30 * 30 EQUB LO(SHIP_BOULDER_EDGES - SHIP_BOULDER) ; Edges data offset (low) EQUB LO(SHIP_BOULDER_FACES - SHIP_BOULDER) ; Faces data offset (low) EQUB 49 ; Max. edge count = (49 - 1) / 4 = 12 EQUB 0 ; Gun vertex = 0 EQUB 14 ; Explosion count = 2, as (4 * n) + 6 = 14 EQUB 42 ; Number of vertices = 42 / 6 = 7 EQUB 15 ; Number of edges = 15 EQUW 1 ; Bounty = 1 EQUB 40 ; Number of faces = 40 / 4 = 10 EQUB 20 ; Visibility distance = 20 EQUB 20 ; Max. energy = 20 EQUB 30 ; Max. speed = 30 EQUB HI(SHIP_BOULDER_EDGES - SHIP_BOULDER) ; Edges data offset (high) EQUB HI(SHIP_BOULDER_FACES - SHIP_BOULDER) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_BOULDER_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -18, 37, -11, 1, 0, 9, 5, 31 ; Vertex 0 VERTEX 30, 7, 12, 2, 1, 6, 5, 31 ; Vertex 1 VERTEX 28, -7, -12, 3, 2, 7, 6, 31 ; Vertex 2 VERTEX 2, 0, -39, 4, 3, 8, 7, 31 ; Vertex 3 VERTEX -28, 34, -30, 4, 0, 9, 8, 31 ; Vertex 4 VERTEX 5, -10, 13, 15, 15, 15, 15, 31 ; Vertex 5 VERTEX 20, 17, -30, 15, 15, 15, 15, 31 ; Vertex 6 .SHIP_BOULDER_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 5, 1, 31 ; Edge 0 EDGE 1, 2, 6, 2, 31 ; Edge 1 EDGE 2, 3, 7, 3, 31 ; Edge 2 EDGE 3, 4, 8, 4, 31 ; Edge 3 EDGE 4, 0, 9, 0, 31 ; Edge 4 EDGE 0, 5, 1, 0, 31 ; Edge 5 EDGE 1, 5, 2, 1, 31 ; Edge 6 EDGE 2, 5, 3, 2, 31 ; Edge 7 EDGE 3, 5, 4, 3, 31 ; Edge 8 EDGE 4, 5, 4, 0, 31 ; Edge 9 EDGE 0, 6, 9, 5, 31 ; Edge 10 EDGE 1, 6, 6, 5, 31 ; Edge 11 EDGE 2, 6, 7, 6, 31 ; Edge 12 EDGE 3, 6, 8, 7, 31 ; Edge 13 EDGE 4, 6, 9, 8, 31 ; Edge 14 .SHIP_BOULDER_FACES ; normal_x, normal_y, normal_z, visibility FACE -15, -3, 8, 31 ; Face 0 FACE -7, 12, 30, 31 ; Face 1 FACE 32, -47, 24, 31 ; Face 2 FACE -3, -39, -7, 31 ; Face 3 FACE -5, -4, -1, 31 ; Face 4 FACE 49, 84, 8, 31 ; Face 5 FACE 112, 21, -21, 31 ; Face 6 FACE 76, -35, -82, 31 ; Face 7 FACE 22, 56, -137, 31 ; Face 8 FACE 40, 110, -38, 31 ; Face 9
Name: SHIP_ASTEROID [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for an asteroid Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_ASTEROID * XX21 uses SHIP_ASTEROID
.SHIP_ASTEROID EQUB 0 ; Max. canisters on demise = 0 EQUW 80 * 80 ; Targetable area = 80 * 80 EQUB LO(SHIP_ASTEROID_EDGES - SHIP_ASTEROID) ; Edges data offset (low) EQUB LO(SHIP_ASTEROID_FACES - SHIP_ASTEROID) ; Faces data offset (low) EQUB 69 ; Max. edge count = (69 - 1) / 4 = 17 EQUB 0 ; Gun vertex = 0 EQUB 34 ; Explosion count = 7, as (4 * n) + 6 = 34 EQUB 54 ; Number of vertices = 54 / 6 = 9 EQUB 21 ; Number of edges = 21 EQUW 5 ; Bounty = 5 EQUB 56 ; Number of faces = 56 / 4 = 14 EQUB 50 ; Visibility distance = 50 EQUB 60 ; Max. energy = 60 EQUB 30 ; Max. speed = 30 EQUB HI(SHIP_ASTEROID_EDGES - SHIP_ASTEROID) ; Edges data offset (high) EQUB HI(SHIP_ASTEROID_FACES - SHIP_ASTEROID) ; Faces data offset (high) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_ASTEROID_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 80, 0, 15, 15, 15, 15, 31 ; Vertex 0 VERTEX -80, -10, 0, 15, 15, 15, 15, 31 ; Vertex 1 VERTEX 0, -80, 0, 15, 15, 15, 15, 31 ; Vertex 2 VERTEX 70, -40, 0, 15, 15, 15, 15, 31 ; Vertex 3 VERTEX 60, 50, 0, 5, 6, 12, 13, 31 ; Vertex 4 VERTEX 50, 0, 60, 15, 15, 15, 15, 31 ; Vertex 5 VERTEX -40, 0, 70, 0, 1, 2, 3, 31 ; Vertex 6 VERTEX 0, 30, -75, 15, 15, 15, 15, 31 ; Vertex 7 VERTEX 0, -50, -60, 8, 9, 10, 11, 31 ; Vertex 8 .SHIP_ASTEROID_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 2, 7, 31 ; Edge 0 EDGE 0, 4, 6, 13, 31 ; Edge 1 EDGE 3, 4, 5, 12, 31 ; Edge 2 EDGE 2, 3, 4, 11, 31 ; Edge 3 EDGE 1, 2, 3, 10, 31 ; Edge 4 EDGE 1, 6, 2, 3, 31 ; Edge 5 EDGE 2, 6, 1, 3, 31 ; Edge 6 EDGE 2, 5, 1, 4, 31 ; Edge 7 EDGE 5, 6, 0, 1, 31 ; Edge 8 EDGE 0, 5, 0, 6, 31 ; Edge 9 EDGE 3, 5, 4, 5, 31 ; Edge 10 EDGE 0, 6, 0, 2, 31 ; Edge 11 EDGE 4, 5, 5, 6, 31 ; Edge 12 EDGE 1, 8, 8, 10, 31 ; Edge 13 EDGE 1, 7, 7, 8, 31 ; Edge 14 EDGE 0, 7, 7, 13, 31 ; Edge 15 EDGE 4, 7, 12, 13, 31 ; Edge 16 EDGE 3, 7, 9, 12, 31 ; Edge 17 EDGE 3, 8, 9, 11, 31 ; Edge 18 EDGE 2, 8, 10, 11, 31 ; Edge 19 EDGE 7, 8, 8, 9, 31 ; Edge 20 .SHIP_ASTEROID_FACES ; normal_x, normal_y, normal_z, visibility FACE 9, 66, 81, 31 ; Face 0 FACE 9, -66, 81, 31 ; Face 1 FACE -72, 64, 31, 31 ; Face 2 FACE -64, -73, 47, 31 ; Face 3 FACE 45, -79, 65, 31 ; Face 4 FACE 135, 15, 35, 31 ; Face 5 FACE 38, 76, 70, 31 ; Face 6 FACE -66, 59, -39, 31 ; Face 7 FACE -67, -15, -80, 31 ; Face 8 FACE 66, -14, -75, 31 ; Face 9 FACE -70, -80, -40, 31 ; Face 10 FACE 58, -102, -51, 31 ; Face 11 FACE 81, 9, -67, 31 ; Face 12 FACE 47, 94, -63, 31 ; Face 13
Name: SHIP_SPLINTER [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a splinter Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_SPLINTER * XX21 uses SHIP_SPLINTER

The ship blueprint for the splinter reuses the edges data from the escape pod, so the edges data offset is negative.
.SHIP_SPLINTER EQUB 0 + (11 << 4) ; Max. canisters on demise = 0 ; Market item when scooped = 11 + 1 = 12 (Minerals) EQUW 16 * 16 ; Targetable area = 16 * 16 EQUB LO(SHIP_ESCAPE_POD_EDGES - SHIP_SPLINTER) ; Edges from escape pod EQUB LO(SHIP_SPLINTER_FACES - SHIP_SPLINTER) + 24 ; Faces data offset (low) EQUB 29 ; Max. edge count = (29 - 1) / 4 = 7 EQUB 0 ; Gun vertex = 0 EQUB 22 ; Explosion count = 4, as (4 * n) + 6 = 22 EQUB 24 ; Number of vertices = 24 / 6 = 4 EQUB 6 ; Number of edges = 6 EQUW 0 ; Bounty = 0 EQUB 16 ; Number of faces = 16 / 4 = 4 EQUB 8 ; Visibility distance = 8 EQUB 20 ; Max. energy = 20 EQUB 10 ; Max. speed = 10 EQUB HI(SHIP_ESCAPE_POD_EDGES - SHIP_SPLINTER) ; Edges from escape pod EQUB HI(SHIP_SPLINTER_FACES - SHIP_SPLINTER) ; Faces data offset (low) EQUB 5 ; Normals are scaled by = 2^5 = 32 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_SPLINTER_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -24, -25, 16, 2, 1, 3, 3, 31 ; Vertex 0 VERTEX 0, 12, -10, 2, 0, 3, 3, 31 ; Vertex 1 VERTEX 11, -6, 2, 1, 0, 3, 3, 31 ; Vertex 2 VERTEX 12, 42, 7, 1, 0, 2, 2, 31 ; Vertex 3 .SHIP_SPLINTER_FACES ; normal_x, normal_y, normal_z, visibility FACE 35, 0, 4, 31 ; Face 0 FACE 3, 4, 8, 31 ; Face 1 FACE 1, 8, 12, 31 ; Face 2 FACE 18, 12, 0, 31 ; Face 3
Name: SHIP_SHUTTLE [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Shuttle Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_SHUTTLE * XX21 uses SHIP_SHUTTLE
.SHIP_SHUTTLE EQUB 15 ; Max. canisters on demise = 15 EQUW 50 * 50 ; Targetable area = 50 * 50 EQUB LO(SHIP_SHUTTLE_EDGES - SHIP_SHUTTLE) ; Edges data offset (low) EQUB LO(SHIP_SHUTTLE_FACES - SHIP_SHUTTLE) ; Faces data offset (low) EQUB 113 ; Max. edge count = (113 - 1) / 4 = 28 EQUB 0 ; Gun vertex = 0 EQUB 38 ; Explosion count = 8, as (4 * n) + 6 = 38 EQUB 114 ; Number of vertices = 114 / 6 = 19 EQUB 30 ; Number of edges = 30 EQUW 0 ; Bounty = 0 EQUB 52 ; Number of faces = 52 / 4 = 13 EQUB 22 ; Visibility distance = 22 EQUB 32 ; Max. energy = 32 EQUB 8 ; Max. speed = 8 EQUB HI(SHIP_SHUTTLE_EDGES - SHIP_SHUTTLE) ; Edges data offset (high) EQUB HI(SHIP_SHUTTLE_FACES - SHIP_SHUTTLE) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_SHUTTLE_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, -17, 23, 15, 15, 15, 15, 31 ; Vertex 0 VERTEX -17, 0, 23, 15, 15, 15, 15, 31 ; Vertex 1 VERTEX 0, 18, 23, 15, 15, 15, 15, 31 ; Vertex 2 VERTEX 18, 0, 23, 15, 15, 15, 15, 31 ; Vertex 3 VERTEX -20, -20, -27, 2, 1, 9, 3, 31 ; Vertex 4 VERTEX -20, 20, -27, 4, 3, 9, 5, 31 ; Vertex 5 VERTEX 20, 20, -27, 6, 5, 9, 7, 31 ; Vertex 6 VERTEX 20, -20, -27, 7, 1, 9, 8, 31 ; Vertex 7 VERTEX 5, 0, -27, 9, 9, 9, 9, 16 ; Vertex 8 VERTEX 0, -2, -27, 9, 9, 9, 9, 16 ; Vertex 9 VERTEX -5, 0, -27, 9, 9, 9, 9, 9 ; Vertex 10 VERTEX 0, 3, -27, 9, 9, 9, 9, 9 ; Vertex 11 VERTEX 0, -9, 35, 10, 0, 12, 11, 16 ; Vertex 12 VERTEX 3, -1, 31, 15, 15, 2, 0, 7 ; Vertex 13 VERTEX 4, 11, 25, 1, 0, 4, 15, 8 ; Vertex 14 VERTEX 11, 4, 25, 1, 10, 15, 3, 8 ; Vertex 15 VERTEX -3, -1, 31, 11, 6, 3, 2, 7 ; Vertex 16 VERTEX -3, 11, 25, 8, 15, 0, 12, 8 ; Vertex 17 VERTEX -10, 4, 25, 15, 4, 8, 1, 8 ; Vertex 18 .SHIP_SHUTTLE_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 2, 0, 31 ; Edge 0 EDGE 1, 2, 10, 4, 31 ; Edge 1 EDGE 2, 3, 11, 6, 31 ; Edge 2 EDGE 0, 3, 12, 8, 31 ; Edge 3 EDGE 0, 7, 8, 1, 31 ; Edge 4 EDGE 0, 4, 2, 1, 24 ; Edge 5 EDGE 1, 4, 3, 2, 31 ; Edge 6 EDGE 1, 5, 4, 3, 24 ; Edge 7 EDGE 2, 5, 5, 4, 31 ; Edge 8 EDGE 2, 6, 6, 5, 12 ; Edge 9 EDGE 3, 6, 7, 6, 31 ; Edge 10 EDGE 3, 7, 8, 7, 24 ; Edge 11 EDGE 4, 5, 9, 3, 31 ; Edge 12 EDGE 5, 6, 9, 5, 31 ; Edge 13 EDGE 6, 7, 9, 7, 31 ; Edge 14 EDGE 4, 7, 9, 1, 31 ; Edge 15 EDGE 0, 12, 12, 0, 16 ; Edge 16 EDGE 1, 12, 10, 0, 16 ; Edge 17 EDGE 2, 12, 11, 10, 16 ; Edge 18 EDGE 3, 12, 12, 11, 16 ; Edge 19 EDGE 8, 9, 9, 9, 16 ; Edge 20 EDGE 9, 10, 9, 9, 7 ; Edge 21 EDGE 10, 11, 9, 9, 9 ; Edge 22 EDGE 8, 11, 9, 9, 7 ; Edge 23 EDGE 13, 14, 11, 11, 5 ; Edge 24 EDGE 14, 15, 11, 11, 8 ; Edge 25 EDGE 13, 15, 11, 11, 7 ; Edge 26 EDGE 16, 17, 10, 10, 5 ; Edge 27 EDGE 17, 18, 10, 10, 8 ; Edge 28 EDGE 16, 18, 10, 10, 7 ; Edge 29 .SHIP_SHUTTLE_FACES ; normal_x, normal_y, normal_z, visibility FACE -55, -55, 40, 31 ; Face 0 FACE 0, -74, 4, 31 ; Face 1 FACE -51, -51, 23, 31 ; Face 2 FACE -74, 0, 4, 31 ; Face 3 FACE -51, 51, 23, 31 ; Face 4 FACE 0, 74, 4, 31 ; Face 5 FACE 51, 51, 23, 31 ; Face 6 FACE 74, 0, 4, 31 ; Face 7 FACE 51, -51, 23, 31 ; Face 8 FACE 0, 0, -107, 31 ; Face 9 FACE -41, 41, 90, 31 ; Face 10 FACE 41, 41, 90, 31 ; Face 11 FACE 55, -55, 40, 31 ; Face 12
Name: SHIP_TRANSPORTER [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Transporter Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_TRANSPORTER * XX21 uses SHIP_TRANSPORTER
.SHIP_TRANSPORTER EQUB 0 ; Max. canisters on demise = 0 EQUW 50 * 50 ; Targetable area = 50 * 50 EQUB LO(SHIP_TRANSPORTER_EDGES - SHIP_TRANSPORTER) ; Edges data offset (low) EQUB LO(SHIP_TRANSPORTER_FACES - SHIP_TRANSPORTER) ; Faces data offset (low) EQUB 149 ; Max. edge count = (149 - 1) / 4 = 37 EQUB 48 ; Gun vertex = 48 / 4 = 12 EQUB 26 ; Explosion count = 5, as (4 * n) + 6 = 26 EQUB 222 ; Number of vertices = 222 / 6 = 37 EQUB 46 ; Number of edges = 46 EQUW 0 ; Bounty = 0 EQUB 56 ; Number of faces = 56 / 4 = 14 EQUB 16 ; Visibility distance = 16 EQUB 32 ; Max. energy = 32 EQUB 10 ; Max. speed = 10 EQUB HI(SHIP_TRANSPORTER_EDGES - SHIP_TRANSPORTER) ; Edges data offset (high) EQUB HI(SHIP_TRANSPORTER_FACES - SHIP_TRANSPORTER) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_TRANSPORTER_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 10, -26, 6, 0, 7, 7, 31 ; Vertex 0 VERTEX -25, 4, -26, 1, 0, 7, 7, 31 ; Vertex 1 VERTEX -28, -3, -26, 1, 0, 2, 2, 31 ; Vertex 2 VERTEX -25, -8, -26, 2, 0, 3, 3, 31 ; Vertex 3 VERTEX 26, -8, -26, 3, 0, 4, 4, 31 ; Vertex 4 VERTEX 29, -3, -26, 4, 0, 5, 5, 31 ; Vertex 5 VERTEX 26, 4, -26, 5, 0, 6, 6, 31 ; Vertex 6 VERTEX 0, 6, 12, 15, 15, 15, 15, 19 ; Vertex 7 VERTEX -30, -1, 12, 7, 1, 9, 8, 31 ; Vertex 8 VERTEX -33, -8, 12, 2, 1, 9, 3, 31 ; Vertex 9 VERTEX 33, -8, 12, 4, 3, 10, 5, 31 ; Vertex 10 VERTEX 30, -1, 12, 6, 5, 11, 10, 31 ; Vertex 11 VERTEX -11, -2, 30, 9, 8, 13, 12, 31 ; Vertex 12 VERTEX -13, -8, 30, 9, 3, 13, 13, 31 ; Vertex 13 VERTEX 14, -8, 30, 10, 3, 13, 13, 31 ; Vertex 14 VERTEX 11, -2, 30, 11, 10, 13, 12, 31 ; Vertex 15 VERTEX -5, 6, 2, 7, 7, 7, 7, 7 ; Vertex 16 VERTEX -18, 3, 2, 7, 7, 7, 7, 7 ; Vertex 17 VERTEX -5, 7, -7, 7, 7, 7, 7, 7 ; Vertex 18 VERTEX -18, 4, -7, 7, 7, 7, 7, 7 ; Vertex 19 VERTEX -11, 6, -14, 7, 7, 7, 7, 7 ; Vertex 20 VERTEX -11, 5, -7, 7, 7, 7, 7, 7 ; Vertex 21 VERTEX 5, 7, -14, 6, 6, 6, 6, 7 ; Vertex 22 VERTEX 18, 4, -14, 6, 6, 6, 6, 7 ; Vertex 23 VERTEX 11, 5, -7, 6, 6, 6, 6, 7 ; Vertex 24 VERTEX 5, 6, -3, 6, 6, 6, 6, 7 ; Vertex 25 VERTEX 18, 3, -3, 6, 6, 6, 6, 7 ; Vertex 26 VERTEX 11, 4, 8, 6, 6, 6, 6, 7 ; Vertex 27 VERTEX 11, 5, -3, 6, 6, 6, 6, 7 ; Vertex 28 VERTEX -16, -8, -13, 3, 3, 3, 3, 6 ; Vertex 29 VERTEX -16, -8, 16, 3, 3, 3, 3, 6 ; Vertex 30 VERTEX 17, -8, -13, 3, 3, 3, 3, 6 ; Vertex 31 VERTEX 17, -8, 16, 3, 3, 3, 3, 6 ; Vertex 32 VERTEX -13, -3, -26, 0, 0, 0, 0, 8 ; Vertex 33 VERTEX 13, -3, -26, 0, 0, 0, 0, 8 ; Vertex 34 VERTEX 9, 3, -26, 0, 0, 0, 0, 5 ; Vertex 35 VERTEX -8, 3, -26, 0, 0, 0, 0, 5 ; Vertex 36 .SHIP_TRANSPORTER_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 7, 0, 31 ; Edge 0 EDGE 1, 2, 1, 0, 31 ; Edge 1 EDGE 2, 3, 2, 0, 31 ; Edge 2 EDGE 3, 4, 3, 0, 31 ; Edge 3 EDGE 4, 5, 4, 0, 31 ; Edge 4 EDGE 5, 6, 5, 0, 31 ; Edge 5 EDGE 0, 6, 6, 0, 31 ; Edge 6 EDGE 0, 7, 7, 6, 16 ; Edge 7 EDGE 1, 8, 7, 1, 31 ; Edge 8 EDGE 2, 9, 2, 1, 11 ; Edge 9 EDGE 3, 9, 3, 2, 31 ; Edge 10 EDGE 4, 10, 4, 3, 31 ; Edge 11 EDGE 5, 10, 5, 4, 11 ; Edge 12 EDGE 6, 11, 6, 5, 31 ; Edge 13 EDGE 7, 8, 8, 7, 17 ; Edge 14 EDGE 8, 9, 9, 1, 17 ; Edge 15 EDGE 10, 11, 10, 5, 17 ; Edge 16 EDGE 7, 11, 11, 6, 17 ; Edge 17 EDGE 7, 15, 12, 11, 19 ; Edge 18 EDGE 7, 12, 12, 8, 19 ; Edge 19 EDGE 8, 12, 9, 8, 16 ; Edge 20 EDGE 9, 13, 9, 3, 31 ; Edge 21 EDGE 10, 14, 10, 3, 31 ; Edge 22 EDGE 11, 15, 11, 10, 16 ; Edge 23 EDGE 12, 13, 13, 9, 31 ; Edge 24 EDGE 13, 14, 13, 3, 31 ; Edge 25 EDGE 14, 15, 13, 10, 31 ; Edge 26 EDGE 12, 15, 13, 12, 31 ; Edge 27 EDGE 16, 17, 7, 7, 7 ; Edge 28 EDGE 18, 19, 7, 7, 7 ; Edge 29 EDGE 19, 20, 7, 7, 7 ; Edge 30 EDGE 18, 20, 7, 7, 7 ; Edge 31 EDGE 20, 21, 7, 7, 7 ; Edge 32 EDGE 22, 23, 6, 6, 7 ; Edge 33 EDGE 23, 24, 6, 6, 7 ; Edge 34 EDGE 24, 22, 6, 6, 7 ; Edge 35 EDGE 25, 26, 6, 6, 7 ; Edge 36 EDGE 26, 27, 6, 6, 7 ; Edge 37 EDGE 25, 27, 6, 6, 7 ; Edge 38 EDGE 27, 28, 6, 6, 7 ; Edge 39 EDGE 29, 30, 3, 3, 6 ; Edge 40 EDGE 31, 32, 3, 3, 6 ; Edge 41 EDGE 33, 34, 0, 0, 8 ; Edge 42 EDGE 34, 35, 0, 0, 5 ; Edge 43 EDGE 35, 36, 0, 0, 5 ; Edge 44 EDGE 36, 33, 0, 0, 5 ; Edge 45 .SHIP_TRANSPORTER_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 0, -103, 31 ; Face 0 FACE -111, 48, -7, 31 ; Face 1 FACE -105, -63, -21, 31 ; Face 2 FACE 0, -34, 0, 31 ; Face 3 FACE 105, -63, -21, 31 ; Face 4 FACE 111, 48, -7, 31 ; Face 5 FACE 8, 32, 3, 31 ; Face 6 FACE -8, 32, 3, 31 ; Face 7 FACE -8, 34, 11, 19 ; Face 8 FACE -75, 32, 79, 31 ; Face 9 FACE 75, 32, 79, 31 ; Face 10 FACE 8, 34, 11, 19 ; Face 11 FACE 0, 38, 17, 31 ; Face 12 FACE 0, 0, 121, 31 ; Face 13
Name: SHIP_COBRA_MK_3 [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Cobra Mk III Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_COBRA_MK_3 * XX21 uses SHIP_COBRA_MK_3
.SHIP_COBRA_MK_3 EQUB 3 ; Max. canisters on demise = 3 EQUW 95 * 95 ; Targetable area = 95 * 95 EQUB LO(SHIP_COBRA_MK_3_EDGES - SHIP_COBRA_MK_3) ; Edges data offset (low) EQUB LO(SHIP_COBRA_MK_3_FACES - SHIP_COBRA_MK_3) ; Faces data offset (low) EQUB 157 ; Max. edge count = (157 - 1) / 4 = 39 EQUB 84 ; Gun vertex = 84 / 4 = 21 EQUB 42 ; Explosion count = 9, as (4 * n) + 6 = 42 EQUB 168 ; Number of vertices = 168 / 6 = 28 EQUB 38 ; Number of edges = 38 EQUW 0 ; Bounty = 0 EQUB 52 ; Number of faces = 52 / 4 = 13 EQUB 50 ; Visibility distance = 50 EQUB 150 ; Max. energy = 150 EQUB 28 ; Max. speed = 28 EQUB HI(SHIP_COBRA_MK_3_EDGES - SHIP_COBRA_MK_3) ; Edges data offset (low) EQUB HI(SHIP_COBRA_MK_3_FACES - SHIP_COBRA_MK_3) ; Faces data offset (low) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00010011 ; Laser power = 2 ; Missiles = 3 .SHIP_COBRA_MK_3_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 32, 0, 76, 15, 15, 15, 15, 31 ; Vertex 0 VERTEX -32, 0, 76, 15, 15, 15, 15, 31 ; Vertex 1 VERTEX 0, 26, 24, 15, 15, 15, 15, 31 ; Vertex 2 VERTEX -120, -3, -8, 3, 7, 10, 10, 31 ; Vertex 3 VERTEX 120, -3, -8, 4, 8, 12, 12, 31 ; Vertex 4 VERTEX -88, 16, -40, 15, 15, 15, 15, 31 ; Vertex 5 VERTEX 88, 16, -40, 15, 15, 15, 15, 31 ; Vertex 6 VERTEX 128, -8, -40, 8, 9, 12, 12, 31 ; Vertex 7 VERTEX -128, -8, -40, 7, 9, 10, 10, 31 ; Vertex 8 VERTEX 0, 26, -40, 5, 6, 9, 9, 31 ; Vertex 9 VERTEX -32, -24, -40, 9, 10, 11, 11, 31 ; Vertex 10 VERTEX 32, -24, -40, 9, 11, 12, 12, 31 ; Vertex 11 VERTEX -36, 8, -40, 9, 9, 9, 9, 20 ; Vertex 12 VERTEX -8, 12, -40, 9, 9, 9, 9, 20 ; Vertex 13 VERTEX 8, 12, -40, 9, 9, 9, 9, 20 ; Vertex 14 VERTEX 36, 8, -40, 9, 9, 9, 9, 20 ; Vertex 15 VERTEX 36, -12, -40, 9, 9, 9, 9, 20 ; Vertex 16 VERTEX 8, -16, -40, 9, 9, 9, 9, 20 ; Vertex 17 VERTEX -8, -16, -40, 9, 9, 9, 9, 20 ; Vertex 18 VERTEX -36, -12, -40, 9, 9, 9, 9, 20 ; Vertex 19 VERTEX 0, 0, 76, 0, 11, 11, 11, 6 ; Vertex 20 VERTEX 0, 0, 90, 0, 11, 11, 11, 31 ; Vertex 21 VERTEX -80, -6, -40, 9, 9, 9, 9, 8 ; Vertex 22 VERTEX -80, 6, -40, 9, 9, 9, 9, 8 ; Vertex 23 VERTEX -88, 0, -40, 9, 9, 9, 9, 6 ; Vertex 24 VERTEX 80, 6, -40, 9, 9, 9, 9, 8 ; Vertex 25 VERTEX 88, 0, -40, 9, 9, 9, 9, 6 ; Vertex 26 VERTEX 80, -6, -40, 9, 9, 9, 9, 8 ; Vertex 27 .SHIP_COBRA_MK_3_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 0, 11, 31 ; Edge 0 EDGE 0, 4, 4, 12, 31 ; Edge 1 EDGE 1, 3, 3, 10, 31 ; Edge 2 EDGE 3, 8, 7, 10, 31 ; Edge 3 EDGE 4, 7, 8, 12, 31 ; Edge 4 EDGE 6, 7, 8, 9, 31 ; Edge 5 EDGE 6, 9, 6, 9, 31 ; Edge 6 EDGE 5, 9, 5, 9, 31 ; Edge 7 EDGE 5, 8, 7, 9, 31 ; Edge 8 EDGE 2, 5, 1, 5, 31 ; Edge 9 EDGE 2, 6, 2, 6, 31 ; Edge 10 EDGE 3, 5, 3, 7, 31 ; Edge 11 EDGE 4, 6, 4, 8, 31 ; Edge 12 EDGE 1, 2, 0, 1, 31 ; Edge 13 EDGE 0, 2, 0, 2, 31 ; Edge 14 EDGE 8, 10, 9, 10, 31 ; Edge 15 EDGE 10, 11, 9, 11, 31 ; Edge 16 EDGE 7, 11, 9, 12, 31 ; Edge 17 EDGE 1, 10, 10, 11, 31 ; Edge 18 EDGE 0, 11, 11, 12, 31 ; Edge 19 EDGE 1, 5, 1, 3, 29 ; Edge 20 EDGE 0, 6, 2, 4, 29 ; Edge 21 EDGE 20, 21, 0, 11, 6 ; Edge 22 EDGE 12, 13, 9, 9, 20 ; Edge 23 EDGE 18, 19, 9, 9, 20 ; Edge 24 EDGE 14, 15, 9, 9, 20 ; Edge 25 EDGE 16, 17, 9, 9, 20 ; Edge 26 EDGE 15, 16, 9, 9, 19 ; Edge 27 EDGE 14, 17, 9, 9, 17 ; Edge 28 EDGE 13, 18, 9, 9, 19 ; Edge 29 EDGE 12, 19, 9, 9, 19 ; Edge 30 EDGE 2, 9, 5, 6, 30 ; Edge 31 EDGE 22, 24, 9, 9, 6 ; Edge 32 EDGE 23, 24, 9, 9, 6 ; Edge 33 EDGE 22, 23, 9, 9, 8 ; Edge 34 EDGE 25, 26, 9, 9, 6 ; Edge 35 EDGE 26, 27, 9, 9, 6 ; Edge 36 EDGE 25, 27, 9, 9, 8 ; Edge 37 .SHIP_COBRA_MK_3_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 62, 31, 31 ; Face 0 FACE -18, 55, 16, 31 ; Face 1 FACE 18, 55, 16, 31 ; Face 2 FACE -16, 52, 14, 31 ; Face 3 FACE 16, 52, 14, 31 ; Face 4 FACE -14, 47, 0, 31 ; Face 5 FACE 14, 47, 0, 31 ; Face 6 FACE -61, 102, 0, 31 ; Face 7 FACE 61, 102, 0, 31 ; Face 8 FACE 0, 0, -80, 31 ; Face 9 FACE -7, -42, 9, 31 ; Face 10 FACE 0, -30, 6, 31 ; Face 11 FACE 7, -42, 9, 31 ; Face 12
Name: SHIP_PYTHON [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Python Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_PYTHON * XX21 uses SHIP_PYTHON
.SHIP_PYTHON EQUB 5 ; Max. canisters on demise = 5 EQUW 80 * 80 ; Targetable area = 80 * 80 EQUB LO(SHIP_PYTHON_EDGES - SHIP_PYTHON) ; Edges data offset (low) EQUB LO(SHIP_PYTHON_FACES - SHIP_PYTHON) ; Faces data offset (low) EQUB 89 ; Max. edge count = (89 - 1) / 4 = 22 EQUB 0 ; Gun vertex = 0 EQUB 42 ; Explosion count = 9, as (4 * n) + 6 = 42 EQUB 66 ; Number of vertices = 66 / 6 = 11 EQUB 26 ; Number of edges = 26 EQUW 0 ; Bounty = 0 EQUB 52 ; Number of faces = 52 / 4 = 13 EQUB 40 ; Visibility distance = 40 EQUB 250 ; Max. energy = 250 EQUB 20 ; Max. speed = 20 EQUB HI(SHIP_PYTHON_EDGES - SHIP_PYTHON) ; Edges data offset (high) EQUB HI(SHIP_PYTHON_FACES - SHIP_PYTHON) ; Faces data offset (high) EQUB 0 ; Normals are scaled by = 2^0 = 1 EQUB %00011011 ; Laser power = 3 ; Missiles = 3 .SHIP_PYTHON_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 0, 224, 0, 1, 2, 3, 31 ; Vertex 0 VERTEX 0, 48, 48, 0, 1, 4, 5, 31 ; Vertex 1 VERTEX 96, 0, -16, 15, 15, 15, 15, 31 ; Vertex 2 VERTEX -96, 0, -16, 15, 15, 15, 15, 31 ; Vertex 3 VERTEX 0, 48, -32, 4, 5, 8, 9, 31 ; Vertex 4 VERTEX 0, 24, -112, 9, 8, 12, 12, 31 ; Vertex 5 VERTEX -48, 0, -112, 8, 11, 12, 12, 31 ; Vertex 6 VERTEX 48, 0, -112, 9, 10, 12, 12, 31 ; Vertex 7 VERTEX 0, -48, 48, 2, 3, 6, 7, 31 ; Vertex 8 VERTEX 0, -48, -32, 6, 7, 10, 11, 31 ; Vertex 9 VERTEX 0, -24, -112, 10, 11, 12, 12, 31 ; Vertex 10 .SHIP_PYTHON_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 8, 2, 3, 31 ; Edge 0 EDGE 0, 3, 0, 2, 31 ; Edge 1 EDGE 0, 2, 1, 3, 31 ; Edge 2 EDGE 0, 1, 0, 1, 31 ; Edge 3 EDGE 2, 4, 9, 5, 31 ; Edge 4 EDGE 1, 2, 1, 5, 31 ; Edge 5 EDGE 2, 8, 7, 3, 31 ; Edge 6 EDGE 1, 3, 0, 4, 31 ; Edge 7 EDGE 3, 8, 2, 6, 31 ; Edge 8 EDGE 2, 9, 7, 10, 31 ; Edge 9 EDGE 3, 4, 4, 8, 31 ; Edge 10 EDGE 3, 9, 6, 11, 31 ; Edge 11 EDGE 3, 5, 8, 8, 7 ; Edge 12 EDGE 3, 10, 11, 11, 7 ; Edge 13 EDGE 2, 5, 9, 9, 7 ; Edge 14 EDGE 2, 10, 10, 10, 7 ; Edge 15 EDGE 2, 7, 9, 10, 31 ; Edge 16 EDGE 3, 6, 8, 11, 31 ; Edge 17 EDGE 5, 6, 8, 12, 31 ; Edge 18 EDGE 5, 7, 9, 12, 31 ; Edge 19 EDGE 7, 10, 12, 10, 31 ; Edge 20 EDGE 6, 10, 11, 12, 31 ; Edge 21 EDGE 4, 5, 8, 9, 31 ; Edge 22 EDGE 9, 10, 10, 11, 31 ; Edge 23 EDGE 1, 4, 4, 5, 31 ; Edge 24 EDGE 8, 9, 6, 7, 31 ; Edge 25 .SHIP_PYTHON_FACES ; normal_x, normal_y, normal_z, visibility FACE -27, 40, 11, 31 ; Face 0 FACE 27, 40, 11, 31 ; Face 1 FACE -27, -40, 11, 31 ; Face 2 FACE 27, -40, 11, 31 ; Face 3 FACE -19, 38, 0, 31 ; Face 4 FACE 19, 38, 0, 31 ; Face 5 FACE -19, -38, 0, 31 ; Face 6 FACE 19, -38, 0, 31 ; Face 7 FACE -25, 37, -11, 31 ; Face 8 FACE 25, 37, -11, 31 ; Face 9 FACE 25, -37, -11, 31 ; Face 10 FACE -25, -37, -11, 31 ; Face 11 FACE 0, 0, -112, 31 ; Face 12
Name: SHIP_BOA [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Boa Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_BOA * XX21 uses SHIP_BOA
.SHIP_BOA EQUB 5 ; Max. canisters on demise = 5 EQUW 70 * 70 ; Targetable area = 70 * 70 EQUB LO(SHIP_BOA_EDGES - SHIP_BOA) ; Edges data offset (low) EQUB LO(SHIP_BOA_FACES - SHIP_BOA) ; Faces data offset (low) EQUB 93 ; Max. edge count = (93 - 1) / 4 = 23 EQUB 0 ; Gun vertex = 0 EQUB 38 ; Explosion count = 8, as (4 * n) + 6 = 38 EQUB 78 ; Number of vertices = 78 / 6 = 13 EQUB 24 ; Number of edges = 24 EQUW 0 ; Bounty = 0 EQUB 52 ; Number of faces = 52 / 4 = 13 EQUB 40 ; Visibility distance = 40 EQUB 250 ; Max. energy = 250 EQUB 24 ; Max. speed = 24 EQUB HI(SHIP_BOA_EDGES - SHIP_BOA) ; Edges data offset (high) EQUB HI(SHIP_BOA_FACES - SHIP_BOA) ; Faces data offset (high) EQUB 0 ; Normals are scaled by = 2^0 = 1 EQUB %00011100 ; Laser power = 3 ; Missiles = 4 .SHIP_BOA_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 0, 93, 15, 15, 15, 15, 31 ; Vertex 0 VERTEX 0, 40, -87, 2, 0, 3, 3, 24 ; Vertex 1 VERTEX 38, -25, -99, 1, 0, 4, 4, 24 ; Vertex 2 VERTEX -38, -25, -99, 2, 1, 5, 5, 24 ; Vertex 3 VERTEX -38, 40, -59, 3, 2, 9, 6, 31 ; Vertex 4 VERTEX 38, 40, -59, 3, 0, 11, 6, 31 ; Vertex 5 VERTEX 62, 0, -67, 4, 0, 11, 8, 31 ; Vertex 6 VERTEX 24, -65, -79, 4, 1, 10, 8, 31 ; Vertex 7 VERTEX -24, -65, -79, 5, 1, 10, 7, 31 ; Vertex 8 VERTEX -62, 0, -67, 5, 2, 9, 7, 31 ; Vertex 9 VERTEX 0, 7, -107, 2, 0, 10, 10, 22 ; Vertex 10 VERTEX 13, -9, -107, 1, 0, 10, 10, 22 ; Vertex 11 VERTEX -13, -9, -107, 2, 1, 12, 12, 22 ; Vertex 12 .SHIP_BOA_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 5, 11, 6, 31 ; Edge 0 EDGE 0, 7, 10, 8, 31 ; Edge 1 EDGE 0, 9, 9, 7, 31 ; Edge 2 EDGE 0, 4, 9, 6, 29 ; Edge 3 EDGE 0, 6, 11, 8, 29 ; Edge 4 EDGE 0, 8, 10, 7, 29 ; Edge 5 EDGE 4, 5, 6, 3, 31 ; Edge 6 EDGE 5, 6, 11, 0, 31 ; Edge 7 EDGE 6, 7, 8, 4, 31 ; Edge 8 EDGE 7, 8, 10, 1, 31 ; Edge 9 EDGE 8, 9, 7, 5, 31 ; Edge 10 EDGE 4, 9, 9, 2, 31 ; Edge 11 EDGE 1, 4, 3, 2, 24 ; Edge 12 EDGE 1, 5, 3, 0, 24 ; Edge 13 EDGE 3, 9, 5, 2, 24 ; Edge 14 EDGE 3, 8, 5, 1, 24 ; Edge 15 EDGE 2, 6, 4, 0, 24 ; Edge 16 EDGE 2, 7, 4, 1, 24 ; Edge 17 EDGE 1, 10, 2, 0, 22 ; Edge 18 EDGE 2, 11, 1, 0, 22 ; Edge 19 EDGE 3, 12, 2, 1, 22 ; Edge 20 EDGE 10, 11, 12, 0, 14 ; Edge 21 EDGE 11, 12, 12, 1, 14 ; Edge 22 EDGE 12, 10, 12, 2, 14 ; Edge 23 .SHIP_BOA_FACES ; normal_x, normal_y, normal_z, visibility FACE 43, 37, -60, 31 ; Face 0 FACE 0, -45, -89, 31 ; Face 1 FACE -43, 37, -60, 31 ; Face 2 FACE 0, 40, 0, 31 ; Face 3 FACE 62, -32, -20, 31 ; Face 4 FACE -62, -32, -20, 31 ; Face 5 FACE 0, 23, 6, 31 ; Face 6 FACE -23, -15, 9, 31 ; Face 7 FACE 23, -15, 9, 31 ; Face 8 FACE -26, 13, 10, 31 ; Face 9 FACE 0, -31, 12, 31 ; Face 10 FACE 26, 13, 10, 31 ; Face 11 FACE 0, 0, -107, 14 ; Face 12
Name: SHIP_ANACONDA [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for an Anaconda Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_ANACONDA * XX21 uses SHIP_ANACONDA
.SHIP_ANACONDA EQUB 7 ; Max. canisters on demise = 7 EQUW 100 * 100 ; Targetable area = 100 * 100 EQUB LO(SHIP_ANACONDA_EDGES - SHIP_ANACONDA) ; Edges data offset (low) EQUB LO(SHIP_ANACONDA_FACES - SHIP_ANACONDA) ; Faces data offset (low) EQUB 93 ; Max. edge count = (93 - 1) / 4 = 23 EQUB 48 ; Gun vertex = 48 / 4 = 12 EQUB 46 ; Explosion count = 10, as (4 * n) + 6 = 46 EQUB 90 ; Number of vertices = 90 / 6 = 15 EQUB 25 ; Number of edges = 25 EQUW 0 ; Bounty = 0 EQUB 48 ; Number of faces = 48 / 4 = 12 EQUB 36 ; Visibility distance = 36 EQUB 252 ; Max. energy = 252 EQUB 14 ; Max. speed = 14 EQUB HI(SHIP_ANACONDA_EDGES - SHIP_ANACONDA) ; Edges data offset (high) EQUB HI(SHIP_ANACONDA_FACES - SHIP_ANACONDA) ; Faces data offset (high) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00111111 ; Laser power = 7 ; Missiles = 7 .SHIP_ANACONDA_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 7, -58, 1, 0, 5, 5, 30 ; Vertex 0 VERTEX -43, -13, -37, 1, 0, 2, 2, 30 ; Vertex 1 VERTEX -26, -47, -3, 2, 0, 3, 3, 30 ; Vertex 2 VERTEX 26, -47, -3, 3, 0, 4, 4, 30 ; Vertex 3 VERTEX 43, -13, -37, 4, 0, 5, 5, 30 ; Vertex 4 VERTEX 0, 48, -49, 5, 1, 6, 6, 30 ; Vertex 5 VERTEX -69, 15, -15, 2, 1, 7, 7, 30 ; Vertex 6 VERTEX -43, -39, 40, 3, 2, 8, 8, 31 ; Vertex 7 VERTEX 43, -39, 40, 4, 3, 9, 9, 31 ; Vertex 8 VERTEX 69, 15, -15, 5, 4, 10, 10, 30 ; Vertex 9 VERTEX -43, 53, -23, 15, 15, 15, 15, 31 ; Vertex 10 VERTEX -69, -1, 32, 7, 2, 8, 8, 31 ; Vertex 11 VERTEX 0, 0, 254, 15, 15, 15, 15, 31 ; Vertex 12 VERTEX 69, -1, 32, 9, 4, 10, 10, 31 ; Vertex 13 VERTEX 43, 53, -23, 15, 15, 15, 15, 31 ; Vertex 14 .SHIP_ANACONDA_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 1, 0, 30 ; Edge 0 EDGE 1, 2, 2, 0, 30 ; Edge 1 EDGE 2, 3, 3, 0, 30 ; Edge 2 EDGE 3, 4, 4, 0, 30 ; Edge 3 EDGE 0, 4, 5, 0, 30 ; Edge 4 EDGE 0, 5, 5, 1, 29 ; Edge 5 EDGE 1, 6, 2, 1, 29 ; Edge 6 EDGE 2, 7, 3, 2, 29 ; Edge 7 EDGE 3, 8, 4, 3, 29 ; Edge 8 EDGE 4, 9, 5, 4, 29 ; Edge 9 EDGE 5, 10, 6, 1, 30 ; Edge 10 EDGE 6, 10, 7, 1, 30 ; Edge 11 EDGE 6, 11, 7, 2, 30 ; Edge 12 EDGE 7, 11, 8, 2, 30 ; Edge 13 EDGE 7, 12, 8, 3, 31 ; Edge 14 EDGE 8, 12, 9, 3, 31 ; Edge 15 EDGE 8, 13, 9, 4, 30 ; Edge 16 EDGE 9, 13, 10, 4, 30 ; Edge 17 EDGE 9, 14, 10, 5, 30 ; Edge 18 EDGE 5, 14, 6, 5, 30 ; Edge 19 EDGE 10, 14, 11, 6, 30 ; Edge 20 EDGE 10, 12, 11, 7, 31 ; Edge 21 EDGE 11, 12, 8, 7, 31 ; Edge 22 EDGE 12, 13, 10, 9, 31 ; Edge 23 EDGE 12, 14, 11, 10, 31 ; Edge 24 .SHIP_ANACONDA_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, -51, -49, 30 ; Face 0 FACE -51, 18, -87, 30 ; Face 1 FACE -77, -57, -19, 30 ; Face 2 FACE 0, -90, 16, 31 ; Face 3 FACE 77, -57, -19, 30 ; Face 4 FACE 51, 18, -87, 30 ; Face 5 FACE 0, 111, -20, 30 ; Face 6 FACE -97, 72, 24, 31 ; Face 7 FACE -108, -68, 34, 31 ; Face 8 FACE 108, -68, 34, 31 ; Face 9 FACE 97, 72, 24, 31 ; Face 10 FACE 0, 94, 18, 31 ; Face 11
Name: SHIP_ROCK_HERMIT [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a rock hermit (asteroid) Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_ROCK_HERMIT * XX21 uses SHIP_ROCK_HERMIT

The ship blueprint for the rock hermit reuses the edges and faces data from the asteroid, so the edges and faces data offsets are negative.
.SHIP_ROCK_HERMIT EQUB 7 ; Max. canisters on demise = 7 EQUW 80 * 80 ; Targetable area = 80 * 80 EQUB LO(SHIP_ROCK_HERMIT_EDGES - SHIP_ROCK_HERMIT) ; Edges data offset (low) EQUB LO(SHIP_ROCK_HERMIT_FACES - SHIP_ROCK_HERMIT) ; Faces data offset (low) EQUB 69 ; Max. edge count = (69 - 1) / 4 = 17 EQUB 0 ; Gun vertex = 0 EQUB 50 ; Explosion count = 11, as (4 * n) + 6 = 50 EQUB 54 ; Number of vertices = 54 / 6 = 9 EQUB 21 ; Number of edges = 21 EQUW 0 ; Bounty = 0 EQUB 56 ; Number of faces = 56 / 4 = 14 EQUB 50 ; Visibility distance = 50 EQUB 180 ; Max. energy = 180 EQUB 30 ; Max. speed = 30 EQUB HI(SHIP_ROCK_HERMIT_EDGES - SHIP_ROCK_HERMIT) ; Edges data offset (high) EQUB HI(SHIP_ROCK_HERMIT_FACES - SHIP_ROCK_HERMIT) ; Faces data offset (high) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00000010 ; Laser power = 0 ; Missiles = 2 .SHIP_ROCK_HERMIT_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 80, 0, 15, 15, 15, 15, 31 ; Vertex 0 VERTEX -80, -10, 0, 15, 15, 15, 15, 31 ; Vertex 1 VERTEX 0, -80, 0, 15, 15, 15, 15, 31 ; Vertex 2 VERTEX 70, -40, 0, 15, 15, 15, 15, 31 ; Vertex 3 VERTEX 60, 50, 0, 5, 6, 12, 13, 31 ; Vertex 4 VERTEX 50, 0, 60, 15, 15, 15, 15, 31 ; Vertex 5 VERTEX -40, 0, 70, 0, 1, 2, 3, 31 ; Vertex 6 VERTEX 0, 30, -75, 15, 15, 15, 15, 31 ; Vertex 7 VERTEX 0, -50, -60, 8, 9, 10, 11, 31 ; Vertex 8 .SHIP_ROCK_HERMIT_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 2, 7, 31 ; Edge 0 EDGE 0, 4, 6, 13, 31 ; Edge 1 EDGE 3, 4, 5, 12, 31 ; Edge 2 EDGE 2, 3, 4, 11, 31 ; Edge 3 EDGE 1, 2, 3, 10, 31 ; Edge 4 EDGE 1, 6, 2, 3, 31 ; Edge 5 EDGE 2, 6, 1, 3, 31 ; Edge 6 EDGE 2, 5, 1, 4, 31 ; Edge 7 EDGE 5, 6, 0, 1, 31 ; Edge 8 EDGE 0, 5, 0, 6, 31 ; Edge 9 EDGE 3, 5, 4, 5, 31 ; Edge 10 EDGE 0, 6, 0, 2, 31 ; Edge 11 EDGE 4, 5, 5, 6, 31 ; Edge 12 EDGE 1, 8, 8, 10, 31 ; Edge 13 EDGE 1, 7, 7, 8, 31 ; Edge 14 EDGE 0, 7, 7, 13, 31 ; Edge 15 EDGE 4, 7, 12, 13, 31 ; Edge 16 EDGE 3, 7, 9, 12, 31 ; Edge 17 EDGE 3, 8, 9, 11, 31 ; Edge 18 EDGE 2, 8, 10, 11, 31 ; Edge 19 EDGE 7, 8, 8, 9, 31 ; Edge 20 .SHIP_ROCK_HERMIT_FACES ; normal_x, normal_y, normal_z, visibility FACE 9, 66, 81, 31 ; Face 0 FACE 9, -66, 81, 31 ; Face 1 FACE -72, 64, 31, 31 ; Face 2 FACE -64, -73, 47, 31 ; Face 3 FACE 45, -79, 65, 31 ; Face 4 FACE 135, 15, 35, 31 ; Face 5 FACE 38, 76, 70, 31 ; Face 6 FACE -66, 59, -39, 31 ; Face 7 FACE -67, -15, -80, 31 ; Face 8 FACE 66, -14, -75, 31 ; Face 9 FACE -70, -80, -40, 31 ; Face 10 FACE 58, -102, -51, 31 ; Face 11 FACE 81, 9, -67, 31 ; Face 12 FACE 47, 94, -63, 31 ; Face 13
Name: SHIP_VIPER [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Viper Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_VIPER * XX21 uses SHIP_VIPER
.SHIP_VIPER EQUB 0 ; Max. canisters on demise = 0 EQUW 75 * 75 ; Targetable area = 75 * 75 EQUB LO(SHIP_VIPER_EDGES - SHIP_VIPER) ; Edges data offset (low) EQUB LO(SHIP_VIPER_FACES - SHIP_VIPER) ; Faces data offset (low) EQUB 81 ; Max. edge count = (81 - 1) / 4 = 20 EQUB 0 ; Gun vertex = 0 EQUB 42 ; Explosion count = 9, as (4 * n) + 6 = 42 EQUB 90 ; Number of vertices = 90 / 6 = 15 EQUB 20 ; Number of edges = 20 EQUW 0 ; Bounty = 0 EQUB 28 ; Number of faces = 28 / 4 = 7 EQUB 23 ; Visibility distance = 23 EQUB 140 ; Max. energy = 140 EQUB 32 ; Max. speed = 32 EQUB HI(SHIP_VIPER_EDGES - SHIP_VIPER) ; Edges data offset (high) EQUB HI(SHIP_VIPER_FACES - SHIP_VIPER) ; Faces data offset (high) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00010001 ; Laser power = 2 ; Missiles = 1 .SHIP_VIPER_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 0, 72, 1, 2, 3, 4, 31 ; Vertex 0 VERTEX 0, 16, 24, 0, 1, 2, 2, 30 ; Vertex 1 VERTEX 0, -16, 24, 3, 4, 5, 5, 30 ; Vertex 2 VERTEX 48, 0, -24, 2, 4, 6, 6, 31 ; Vertex 3 VERTEX -48, 0, -24, 1, 3, 6, 6, 31 ; Vertex 4 VERTEX 24, -16, -24, 4, 5, 6, 6, 30 ; Vertex 5 VERTEX -24, -16, -24, 5, 3, 6, 6, 30 ; Vertex 6 VERTEX 24, 16, -24, 0, 2, 6, 6, 31 ; Vertex 7 VERTEX -24, 16, -24, 0, 1, 6, 6, 31 ; Vertex 8 VERTEX -32, 0, -24, 6, 6, 6, 6, 19 ; Vertex 9 VERTEX 32, 0, -24, 6, 6, 6, 6, 19 ; Vertex 10 VERTEX 8, 8, -24, 6, 6, 6, 6, 19 ; Vertex 11 VERTEX -8, 8, -24, 6, 6, 6, 6, 19 ; Vertex 12 VERTEX -8, -8, -24, 6, 6, 6, 6, 18 ; Vertex 13 VERTEX 8, -8, -24, 6, 6, 6, 6, 18 ; Vertex 14 .SHIP_VIPER_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 3, 2, 4, 31 ; Edge 0 EDGE 0, 1, 1, 2, 30 ; Edge 1 EDGE 0, 2, 3, 4, 30 ; Edge 2 EDGE 0, 4, 1, 3, 31 ; Edge 3 EDGE 1, 7, 0, 2, 30 ; Edge 4 EDGE 1, 8, 0, 1, 30 ; Edge 5 EDGE 2, 5, 4, 5, 30 ; Edge 6 EDGE 2, 6, 3, 5, 30 ; Edge 7 EDGE 7, 8, 0, 6, 31 ; Edge 8 EDGE 5, 6, 5, 6, 30 ; Edge 9 EDGE 4, 8, 1, 6, 31 ; Edge 10 EDGE 4, 6, 3, 6, 30 ; Edge 11 EDGE 3, 7, 2, 6, 31 ; Edge 12 EDGE 3, 5, 6, 4, 30 ; Edge 13 EDGE 9, 12, 6, 6, 19 ; Edge 14 EDGE 9, 13, 6, 6, 18 ; Edge 15 EDGE 10, 11, 6, 6, 19 ; Edge 16 EDGE 10, 14, 6, 6, 18 ; Edge 17 EDGE 11, 14, 6, 6, 16 ; Edge 18 EDGE 12, 13, 6, 6, 16 ; Edge 19 .SHIP_VIPER_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 32, 0, 31 ; Face 0 FACE -22, 33, 11, 31 ; Face 1 FACE 22, 33, 11, 31 ; Face 2 FACE -22, -33, 11, 31 ; Face 3 FACE 22, -33, 11, 31 ; Face 4 FACE 0, -32, 0, 31 ; Face 5 FACE 0, 0, -48, 31 ; Face 6
Name: SHIP_SIDEWINDER [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Sidewinder Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_SIDEWINDER * XX21 uses SHIP_SIDEWINDER
.SHIP_SIDEWINDER EQUB 0 ; Max. canisters on demise = 0 EQUW 65 * 65 ; Targetable area = 65 * 65 EQUB LO(SHIP_SIDEWINDER_EDGES - SHIP_SIDEWINDER) ; Edges data offset (low) EQUB LO(SHIP_SIDEWINDER_FACES - SHIP_SIDEWINDER) ; Faces data offset (low) EQUB 65 ; Max. edge count = (65 - 1) / 4 = 16 EQUB 0 ; Gun vertex = 0 EQUB 30 ; Explosion count = 6, as (4 * n) + 6 = 30 EQUB 60 ; Number of vertices = 60 / 6 = 10 EQUB 15 ; Number of edges = 15 EQUW 50 ; Bounty = 50 EQUB 28 ; Number of faces = 28 / 4 = 7 EQUB 20 ; Visibility distance = 20 EQUB 70 ; Max. energy = 70 EQUB 37 ; Max. speed = 37 EQUB HI(SHIP_SIDEWINDER_EDGES - SHIP_SIDEWINDER) ; Edges data offset (high) EQUB HI(SHIP_SIDEWINDER_FACES - SHIP_SIDEWINDER) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00010000 ; Laser power = 2 ; Missiles = 0 .SHIP_SIDEWINDER_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -32, 0, 36, 0, 1, 4, 5, 31 ; Vertex 0 VERTEX 32, 0, 36, 0, 2, 5, 6, 31 ; Vertex 1 VERTEX 64, 0, -28, 2, 3, 6, 6, 31 ; Vertex 2 VERTEX -64, 0, -28, 1, 3, 4, 4, 31 ; Vertex 3 VERTEX 0, 16, -28, 0, 1, 2, 3, 31 ; Vertex 4 VERTEX 0, -16, -28, 3, 4, 5, 6, 31 ; Vertex 5 VERTEX -12, 6, -28, 3, 3, 3, 3, 15 ; Vertex 6 VERTEX 12, 6, -28, 3, 3, 3, 3, 15 ; Vertex 7 VERTEX 12, -6, -28, 3, 3, 3, 3, 12 ; Vertex 8 VERTEX -12, -6, -28, 3, 3, 3, 3, 12 ; Vertex 9 .SHIP_SIDEWINDER_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 0, 5, 31 ; Edge 0 EDGE 1, 2, 2, 6, 31 ; Edge 1 EDGE 1, 4, 0, 2, 31 ; Edge 2 EDGE 0, 4, 0, 1, 31 ; Edge 3 EDGE 0, 3, 1, 4, 31 ; Edge 4 EDGE 3, 4, 1, 3, 31 ; Edge 5 EDGE 2, 4, 2, 3, 31 ; Edge 6 EDGE 3, 5, 3, 4, 31 ; Edge 7 EDGE 2, 5, 3, 6, 31 ; Edge 8 EDGE 1, 5, 5, 6, 31 ; Edge 9 EDGE 0, 5, 4, 5, 31 ; Edge 10 EDGE 6, 7, 3, 3, 15 ; Edge 11 EDGE 7, 8, 3, 3, 12 ; Edge 12 EDGE 6, 9, 3, 3, 12 ; Edge 13 EDGE 8, 9, 3, 3, 12 ; Edge 14 .SHIP_SIDEWINDER_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 32, 8, 31 ; Face 0 FACE -12, 47, 6, 31 ; Face 1 FACE 12, 47, 6, 31 ; Face 2 FACE 0, 0, -112, 31 ; Face 3 FACE -12, -47, 6, 31 ; Face 4 FACE 0, -32, 8, 31 ; Face 5 FACE 12, -47, 6, 31 ; Face 6
Name: SHIP_MAMBA [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Mamba Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_MAMBA * XX21 uses SHIP_MAMBA
.SHIP_MAMBA EQUB 1 ; Max. canisters on demise = 1 EQUW 70 * 70 ; Targetable area = 70 * 70 EQUB LO(SHIP_MAMBA_EDGES - SHIP_MAMBA) ; Edges data offset (low) EQUB LO(SHIP_MAMBA_FACES - SHIP_MAMBA) ; Faces data offset (low) EQUB 97 ; Max. edge count = (97 - 1) / 4 = 24 EQUB 0 ; Gun vertex = 0 EQUB 34 ; Explosion count = 7, as (4 * n) + 6 = 34 EQUB 150 ; Number of vertices = 150 / 6 = 25 EQUB 28 ; Number of edges = 28 EQUW 150 ; Bounty = 150 EQUB 20 ; Number of faces = 20 / 4 = 5 EQUB 25 ; Visibility distance = 25 EQUB 90 ; Max. energy = 90 EQUB 30 ; Max. speed = 30 EQUB HI(SHIP_MAMBA_EDGES - SHIP_MAMBA) ; Edges data offset (high) EQUB HI(SHIP_MAMBA_FACES - SHIP_MAMBA) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00010010 ; Laser power = 2 ; Missiles = 2 .SHIP_MAMBA_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 0, 64, 0, 1, 2, 3, 31 ; Vertex 0 VERTEX -64, -8, -32, 0, 2, 4, 4, 31 ; Vertex 1 VERTEX -32, 8, -32, 1, 2, 4, 4, 30 ; Vertex 2 VERTEX 32, 8, -32, 1, 3, 4, 4, 30 ; Vertex 3 VERTEX 64, -8, -32, 0, 3, 4, 4, 31 ; Vertex 4 VERTEX -4, 4, 16, 1, 1, 1, 1, 14 ; Vertex 5 VERTEX 4, 4, 16, 1, 1, 1, 1, 14 ; Vertex 6 VERTEX 8, 3, 28, 1, 1, 1, 1, 13 ; Vertex 7 VERTEX -8, 3, 28, 1, 1, 1, 1, 13 ; Vertex 8 VERTEX -20, -4, 16, 0, 0, 0, 0, 20 ; Vertex 9 VERTEX 20, -4, 16, 0, 0, 0, 0, 20 ; Vertex 10 VERTEX -24, -7, -20, 0, 0, 0, 0, 20 ; Vertex 11 VERTEX -16, -7, -20, 0, 0, 0, 0, 16 ; Vertex 12 VERTEX 16, -7, -20, 0, 0, 0, 0, 16 ; Vertex 13 VERTEX 24, -7, -20, 0, 0, 0, 0, 20 ; Vertex 14 VERTEX -8, 4, -32, 4, 4, 4, 4, 13 ; Vertex 15 VERTEX 8, 4, -32, 4, 4, 4, 4, 13 ; Vertex 16 VERTEX 8, -4, -32, 4, 4, 4, 4, 14 ; Vertex 17 VERTEX -8, -4, -32, 4, 4, 4, 4, 14 ; Vertex 18 VERTEX -32, 4, -32, 4, 4, 4, 4, 7 ; Vertex 19 VERTEX 32, 4, -32, 4, 4, 4, 4, 7 ; Vertex 20 VERTEX 36, -4, -32, 4, 4, 4, 4, 7 ; Vertex 21 VERTEX -36, -4, -32, 4, 4, 4, 4, 7 ; Vertex 22 VERTEX -38, 0, -32, 4, 4, 4, 4, 5 ; Vertex 23 VERTEX 38, 0, -32, 4, 4, 4, 4, 5 ; Vertex 24 .SHIP_MAMBA_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 0, 2, 31 ; Edge 0 EDGE 0, 4, 0, 3, 31 ; Edge 1 EDGE 1, 4, 0, 4, 31 ; Edge 2 EDGE 1, 2, 2, 4, 30 ; Edge 3 EDGE 2, 3, 1, 4, 30 ; Edge 4 EDGE 3, 4, 3, 4, 30 ; Edge 5 EDGE 5, 6, 1, 1, 14 ; Edge 6 EDGE 6, 7, 1, 1, 12 ; Edge 7 EDGE 7, 8, 1, 1, 13 ; Edge 8 EDGE 5, 8, 1, 1, 12 ; Edge 9 EDGE 9, 11, 0, 0, 20 ; Edge 10 EDGE 9, 12, 0, 0, 16 ; Edge 11 EDGE 10, 13, 0, 0, 16 ; Edge 12 EDGE 10, 14, 0, 0, 20 ; Edge 13 EDGE 13, 14, 0, 0, 14 ; Edge 14 EDGE 11, 12, 0, 0, 14 ; Edge 15 EDGE 15, 16, 4, 4, 13 ; Edge 16 EDGE 17, 18, 4, 4, 14 ; Edge 17 EDGE 15, 18, 4, 4, 12 ; Edge 18 EDGE 16, 17, 4, 4, 12 ; Edge 19 EDGE 20, 21, 4, 4, 7 ; Edge 20 EDGE 20, 24, 4, 4, 5 ; Edge 21 EDGE 21, 24, 4, 4, 5 ; Edge 22 EDGE 19, 22, 4, 4, 7 ; Edge 23 EDGE 19, 23, 4, 4, 5 ; Edge 24 EDGE 22, 23, 4, 4, 5 ; Edge 25 EDGE 0, 2, 1, 2, 30 ; Edge 26 EDGE 0, 3, 1, 3, 30 ; Edge 27 .SHIP_MAMBA_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, -24, 2, 30 ; Face 0 FACE 0, 24, 2, 30 ; Face 1 FACE -32, 64, 16, 30 ; Face 2 FACE 32, 64, 16, 30 ; Face 3 FACE 0, 0, -127, 30 ; Face 4
Name: SHIP_KRAIT [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Krait Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_KRAIT * XX21 uses SHIP_KRAIT
.SHIP_KRAIT EQUB 1 ; Max. canisters on demise = 1 EQUW 60 * 60 ; Targetable area = 60 * 60 EQUB LO(SHIP_KRAIT_EDGES - SHIP_KRAIT) ; Edges data offset (low) EQUB LO(SHIP_KRAIT_FACES - SHIP_KRAIT) ; Faces data offset (low) EQUB 89 ; Max. edge count = (89 - 1) / 4 = 22 EQUB 0 ; Gun vertex = 0 EQUB 18 ; Explosion count = 3, as (4 * n) + 6 = 18 EQUB 102 ; Number of vertices = 102 / 6 = 17 EQUB 21 ; Number of edges = 21 EQUW 100 ; Bounty = 100 EQUB 24 ; Number of faces = 24 / 4 = 6 EQUB 20 ; Visibility distance = 20 EQUB 80 ; Max. energy = 80 EQUB 30 ; Max. speed = 30 EQUB HI(SHIP_KRAIT_EDGES - SHIP_KRAIT) ; Edges data offset (high) EQUB HI(SHIP_KRAIT_FACES - SHIP_KRAIT) ; Faces data offset (high) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00010000 ; Laser power = 2 ; Missiles = 0 .SHIP_KRAIT_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 0, 96, 1, 0, 3, 2, 31 ; Vertex 0 VERTEX 0, 18, -48, 3, 0, 5, 4, 31 ; Vertex 1 VERTEX 0, -18, -48, 2, 1, 5, 4, 31 ; Vertex 2 VERTEX 90, 0, -3, 1, 0, 4, 4, 31 ; Vertex 3 VERTEX -90, 0, -3, 3, 2, 5, 5, 31 ; Vertex 4 VERTEX 90, 0, 87, 1, 0, 1, 1, 30 ; Vertex 5 VERTEX -90, 0, 87, 3, 2, 3, 3, 30 ; Vertex 6 VERTEX 0, 5, 53, 0, 0, 3, 3, 9 ; Vertex 7 VERTEX 0, 7, 38, 0, 0, 3, 3, 6 ; Vertex 8 VERTEX -18, 7, 19, 3, 3, 3, 3, 9 ; Vertex 9 VERTEX 18, 7, 19, 0, 0, 0, 0, 9 ; Vertex 10 VERTEX 18, 11, -39, 4, 4, 4, 4, 8 ; Vertex 11 VERTEX 18, -11, -39, 4, 4, 4, 4, 8 ; Vertex 12 VERTEX 36, 0, -30, 4, 4, 4, 4, 8 ; Vertex 13 VERTEX -18, 11, -39, 5, 5, 5, 5, 8 ; Vertex 14 VERTEX -18, -11, -39, 5, 5, 5, 5, 8 ; Vertex 15 VERTEX -36, 0, -30, 5, 5, 5, 5, 8 ; Vertex 16 .SHIP_KRAIT_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 3, 0, 31 ; Edge 0 EDGE 0, 2, 2, 1, 31 ; Edge 1 EDGE 0, 3, 1, 0, 31 ; Edge 2 EDGE 0, 4, 3, 2, 31 ; Edge 3 EDGE 1, 4, 5, 3, 31 ; Edge 4 EDGE 4, 2, 5, 2, 31 ; Edge 5 EDGE 2, 3, 4, 1, 31 ; Edge 6 EDGE 3, 1, 4, 0, 31 ; Edge 7 EDGE 3, 5, 1, 0, 30 ; Edge 8 EDGE 4, 6, 3, 2, 30 ; Edge 9 EDGE 1, 2, 5, 4, 8 ; Edge 10 EDGE 7, 10, 0, 0, 9 ; Edge 11 EDGE 8, 10, 0, 0, 6 ; Edge 12 EDGE 7, 9, 3, 3, 9 ; Edge 13 EDGE 8, 9, 3, 3, 6 ; Edge 14 EDGE 11, 13, 4, 4, 8 ; Edge 15 EDGE 13, 12, 4, 4, 8 ; Edge 16 EDGE 12, 11, 4, 4, 7 ; Edge 17 EDGE 14, 15, 5, 5, 7 ; Edge 18 EDGE 15, 16, 5, 5, 8 ; Edge 19 EDGE 16, 14, 5, 5, 8 ; Edge 20 .SHIP_KRAIT_FACES ; normal_x, normal_y, normal_z, visibility FACE 3, 24, 3, 31 ; Face 0 FACE 3, -24, 3, 31 ; Face 1 FACE -3, -24, 3, 31 ; Face 2 FACE -3, 24, 3, 31 ; Face 3 FACE 38, 0, -77, 31 ; Face 4 FACE -38, 0, -77, 31 ; Face 5
Name: SHIP_ADDER [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for an Adder Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_ADDER * XX21 uses SHIP_ADDER
.SHIP_ADDER EQUB 0 ; Max. canisters on demise = 0 EQUW 50 * 50 ; Targetable area = 50 * 50 EQUB LO(SHIP_ADDER_EDGES - SHIP_ADDER) ; Edges data offset (low) EQUB LO(SHIP_ADDER_FACES - SHIP_ADDER) ; Faces data offset (low) EQUB 101 ; Max. edge count = (101 - 1) / 4 = 25 EQUB 0 ; Gun vertex = 0 EQUB 22 ; Explosion count = 4, as (4 * n) + 6 = 22 EQUB 108 ; Number of vertices = 108 / 6 = 18 EQUB 29 ; Number of edges = 29 EQUW 40 ; Bounty = 40 EQUB 60 ; Number of faces = 60 / 4 = 15 EQUB 20 ; Visibility distance = 20 EQUB 85 ; Max. energy = 85 EQUB 24 ; Max. speed = 24 EQUB HI(SHIP_ADDER_EDGES - SHIP_ADDER) ; Edges data offset (high) EQUB HI(SHIP_ADDER_FACES - SHIP_ADDER) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00010000 ; Laser power = 2 ; Missiles = 0 .SHIP_ADDER_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -18, 0, 40, 1, 0, 12, 11, 31 ; Vertex 0 VERTEX 18, 0, 40, 1, 0, 3, 2, 31 ; Vertex 1 VERTEX 30, 0, -24, 3, 2, 5, 4, 31 ; Vertex 2 VERTEX 30, 0, -40, 5, 4, 6, 6, 31 ; Vertex 3 VERTEX 18, -7, -40, 6, 5, 14, 7, 31 ; Vertex 4 VERTEX -18, -7, -40, 8, 7, 14, 10, 31 ; Vertex 5 VERTEX -30, 0, -40, 9, 8, 10, 10, 31 ; Vertex 6 VERTEX -30, 0, -24, 10, 9, 12, 11, 31 ; Vertex 7 VERTEX -18, 7, -40, 8, 7, 13, 9, 31 ; Vertex 8 VERTEX 18, 7, -40, 6, 4, 13, 7, 31 ; Vertex 9 VERTEX -18, 7, 13, 9, 0, 13, 11, 31 ; Vertex 10 VERTEX 18, 7, 13, 2, 0, 13, 4, 31 ; Vertex 11 VERTEX -18, -7, 13, 10, 1, 14, 12, 31 ; Vertex 12 VERTEX 18, -7, 13, 3, 1, 14, 5, 31 ; Vertex 13 VERTEX -11, 3, 29, 0, 0, 0, 0, 5 ; Vertex 14 VERTEX 11, 3, 29, 0, 0, 0, 0, 5 ; Vertex 15 VERTEX 11, 4, 24, 0, 0, 0, 0, 4 ; Vertex 16 VERTEX -11, 4, 24, 0, 0, 0, 0, 4 ; Vertex 17 .SHIP_ADDER_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 1, 0, 31 ; Edge 0 EDGE 1, 2, 3, 2, 7 ; Edge 1 EDGE 2, 3, 5, 4, 31 ; Edge 2 EDGE 3, 4, 6, 5, 31 ; Edge 3 EDGE 4, 5, 14, 7, 31 ; Edge 4 EDGE 5, 6, 10, 8, 31 ; Edge 5 EDGE 6, 7, 10, 9, 31 ; Edge 6 EDGE 7, 0, 12, 11, 7 ; Edge 7 EDGE 3, 9, 6, 4, 31 ; Edge 8 EDGE 9, 8, 13, 7, 31 ; Edge 9 EDGE 8, 6, 9, 8, 31 ; Edge 10 EDGE 0, 10, 11, 0, 31 ; Edge 11 EDGE 7, 10, 11, 9, 31 ; Edge 12 EDGE 1, 11, 2, 0, 31 ; Edge 13 EDGE 2, 11, 4, 2, 31 ; Edge 14 EDGE 0, 12, 12, 1, 31 ; Edge 15 EDGE 7, 12, 12, 10, 31 ; Edge 16 EDGE 1, 13, 3, 1, 31 ; Edge 17 EDGE 2, 13, 5, 3, 31 ; Edge 18 EDGE 10, 11, 13, 0, 31 ; Edge 19 EDGE 12, 13, 14, 1, 31 ; Edge 20 EDGE 8, 10, 13, 9, 31 ; Edge 21 EDGE 9, 11, 13, 4, 31 ; Edge 22 EDGE 5, 12, 14, 10, 31 ; Edge 23 EDGE 4, 13, 14, 5, 31 ; Edge 24 EDGE 14, 15, 0, 0, 5 ; Edge 25 EDGE 15, 16, 0, 0, 3 ; Edge 26 EDGE 16, 17, 0, 0, 4 ; Edge 27 EDGE 17, 14, 0, 0, 3 ; Edge 28 .SHIP_ADDER_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 39, 10, 31 ; Face 0 FACE 0, -39, 10, 31 ; Face 1 FACE 69, 50, 13, 31 ; Face 2 FACE 69, -50, 13, 31 ; Face 3 FACE 30, 52, 0, 31 ; Face 4 FACE 30, -52, 0, 31 ; Face 5 FACE 0, 0, -160, 31 ; Face 6 FACE 0, 0, -160, 31 ; Face 7 FACE 0, 0, -160, 31 ; Face 8 FACE -30, 52, 0, 31 ; Face 9 FACE -30, -52, 0, 31 ; Face 10 FACE -69, 50, 13, 31 ; Face 11 FACE -69, -50, 13, 31 ; Face 12 FACE 0, 28, 0, 31 ; Face 13 FACE 0, -28, 0, 31 ; Face 14
Name: SHIP_GECKO [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Gecko Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_GECKO * XX21 uses SHIP_GECKO
.SHIP_GECKO EQUB 0 ; Max. canisters on demise = 0 EQUW 99 * 99 ; Targetable area = 99 * 99 EQUB LO(SHIP_GECKO_EDGES - SHIP_GECKO) ; Edges data offset (low) EQUB LO(SHIP_GECKO_FACES - SHIP_GECKO) ; Faces data offset (low) EQUB 69 ; Max. edge count = (69 - 1) / 4 = 17 EQUB 0 ; Gun vertex = 0 EQUB 26 ; Explosion count = 5, as (4 * n) + 6 = 26 EQUB 72 ; Number of vertices = 72 / 6 = 12 EQUB 17 ; Number of edges = 17 EQUW 55 ; Bounty = 55 EQUB 36 ; Number of faces = 36 / 4 = 9 EQUB 18 ; Visibility distance = 18 EQUB 70 ; Max. energy = 70 EQUB 30 ; Max. speed = 30 EQUB HI(SHIP_GECKO_EDGES - SHIP_GECKO) ; Edges data offset (high) EQUB HI(SHIP_GECKO_FACES - SHIP_GECKO) ; Faces data offset (high) EQUB 3 ; Normals are scaled by = 2^3 = 8 EQUB %00010000 ; Laser power = 2 ; Missiles = 0 .SHIP_GECKO_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -10, -4, 47, 3, 0, 5, 4, 31 ; Vertex 0 VERTEX 10, -4, 47, 1, 0, 3, 2, 31 ; Vertex 1 VERTEX -16, 8, -23, 5, 0, 7, 6, 31 ; Vertex 2 VERTEX 16, 8, -23, 1, 0, 8, 7, 31 ; Vertex 3 VERTEX -66, 0, -3, 5, 4, 6, 6, 31 ; Vertex 4 VERTEX 66, 0, -3, 2, 1, 8, 8, 31 ; Vertex 5 VERTEX -20, -14, -23, 4, 3, 7, 6, 31 ; Vertex 6 VERTEX 20, -14, -23, 3, 2, 8, 7, 31 ; Vertex 7 VERTEX -8, -6, 33, 3, 3, 3, 3, 16 ; Vertex 8 VERTEX 8, -6, 33, 3, 3, 3, 3, 17 ; Vertex 9 VERTEX -8, -13, -16, 3, 3, 3, 3, 16 ; Vertex 10 VERTEX 8, -13, -16, 3, 3, 3, 3, 17 ; Vertex 11 .SHIP_GECKO_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 3, 0, 31 ; Edge 0 EDGE 1, 5, 2, 1, 31 ; Edge 1 EDGE 5, 3, 8, 1, 31 ; Edge 2 EDGE 3, 2, 7, 0, 31 ; Edge 3 EDGE 2, 4, 6, 5, 31 ; Edge 4 EDGE 4, 0, 5, 4, 31 ; Edge 5 EDGE 5, 7, 8, 2, 31 ; Edge 6 EDGE 7, 6, 7, 3, 31 ; Edge 7 EDGE 6, 4, 6, 4, 31 ; Edge 8 EDGE 0, 2, 5, 0, 29 ; Edge 9 EDGE 1, 3, 1, 0, 30 ; Edge 10 EDGE 0, 6, 4, 3, 29 ; Edge 11 EDGE 1, 7, 3, 2, 30 ; Edge 12 EDGE 2, 6, 7, 6, 20 ; Edge 13 EDGE 3, 7, 8, 7, 20 ; Edge 14 EDGE 8, 10, 3, 3, 16 ; Edge 15 EDGE 9, 11, 3, 3, 17 ; Edge 16 .SHIP_GECKO_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 31, 5, 31 ; Face 0 FACE 4, 45, 8, 31 ; Face 1 FACE 25, -108, 19, 31 ; Face 2 FACE 0, -84, 12, 31 ; Face 3 FACE -25, -108, 19, 31 ; Face 4 FACE -4, 45, 8, 31 ; Face 5 FACE -88, 16, -214, 31 ; Face 6 FACE 0, 0, -187, 31 ; Face 7 FACE 88, 16, -214, 31 ; Face 8
Name: SHIP_COBRA_MK_1 [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Cobra Mk I Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_COBRA_MK_1 * XX21 uses SHIP_COBRA_MK_1
.SHIP_COBRA_MK_1 EQUB 3 ; Max. canisters on demise = 3 EQUW 99 * 99 ; Targetable area = 99 * 99 EQUB LO(SHIP_COBRA_MK_1_EDGES - SHIP_COBRA_MK_1) ; Edges data offset (low) EQUB LO(SHIP_COBRA_MK_1_FACES - SHIP_COBRA_MK_1) ; Faces data offset (low) EQUB 73 ; Max. edge count = (73 - 1) / 4 = 18 EQUB 40 ; Gun vertex = 40 / 4 = 10 EQUB 26 ; Explosion count = 5, as (4 * n) + 6 = 26 EQUB 66 ; Number of vertices = 66 / 6 = 11 EQUB 18 ; Number of edges = 18 EQUW 75 ; Bounty = 75 EQUB 40 ; Number of faces = 40 / 4 = 10 EQUB 19 ; Visibility distance = 19 EQUB 90 ; Max. energy = 90 EQUB 26 ; Max. speed = 26 EQUB HI(SHIP_COBRA_MK_1_EDGES - SHIP_COBRA_MK_1) ; Edges data offset (high) EQUB HI(SHIP_COBRA_MK_1_FACES - SHIP_COBRA_MK_1) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00010010 ; Laser power = 2 ; Missiles = 2 .SHIP_COBRA_MK_1_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -18, -1, 50, 1, 0, 3, 2, 31 ; Vertex 0 VERTEX 18, -1, 50, 1, 0, 5, 4, 31 ; Vertex 1 VERTEX -66, 0, 7, 3, 2, 8, 8, 31 ; Vertex 2 VERTEX 66, 0, 7, 5, 4, 9, 9, 31 ; Vertex 3 VERTEX -32, 12, -38, 6, 2, 8, 7, 31 ; Vertex 4 VERTEX 32, 12, -38, 6, 4, 9, 7, 31 ; Vertex 5 VERTEX -54, -12, -38, 3, 1, 8, 7, 31 ; Vertex 6 VERTEX 54, -12, -38, 5, 1, 9, 7, 31 ; Vertex 7 VERTEX 0, 12, -6, 2, 0, 6, 4, 20 ; Vertex 8 VERTEX 0, -1, 50, 1, 0, 1, 1, 2 ; Vertex 9 VERTEX 0, -1, 60, 1, 0, 1, 1, 31 ; Vertex 10 .SHIP_COBRA_MK_1_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 1, 0, 1, 0, 31 ; Edge 0 EDGE 0, 2, 3, 2, 31 ; Edge 1 EDGE 2, 6, 8, 3, 31 ; Edge 2 EDGE 6, 7, 7, 1, 31 ; Edge 3 EDGE 7, 3, 9, 5, 31 ; Edge 4 EDGE 3, 1, 5, 4, 31 ; Edge 5 EDGE 2, 4, 8, 2, 31 ; Edge 6 EDGE 4, 5, 7, 6, 31 ; Edge 7 EDGE 5, 3, 9, 4, 31 ; Edge 8 EDGE 0, 8, 2, 0, 20 ; Edge 9 EDGE 8, 1, 4, 0, 20 ; Edge 10 EDGE 4, 8, 6, 2, 16 ; Edge 11 EDGE 8, 5, 6, 4, 16 ; Edge 12 EDGE 4, 6, 8, 7, 31 ; Edge 13 EDGE 5, 7, 9, 7, 31 ; Edge 14 EDGE 0, 6, 3, 1, 20 ; Edge 15 EDGE 1, 7, 5, 1, 20 ; Edge 16 EDGE 10, 9, 1, 0, 2 ; Edge 17 .SHIP_COBRA_MK_1_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 41, 10, 31 ; Face 0 FACE 0, -27, 3, 31 ; Face 1 FACE -8, 46, 8, 31 ; Face 2 FACE -12, -57, 12, 31 ; Face 3 FACE 8, 46, 8, 31 ; Face 4 FACE 12, -57, 12, 31 ; Face 5 FACE 0, 49, 0, 31 ; Face 6 FACE 0, 0, -154, 31 ; Face 7 FACE -121, 111, -62, 31 ; Face 8 FACE 121, 111, -62, 31 ; Face 9
Name: SHIP_WORM [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Worm Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_WORM * XX21 uses SHIP_WORM
.SHIP_WORM EQUB 0 ; Max. canisters on demise = 0 EQUW 99 * 99 ; Targetable area = 99 * 99 EQUB LO(SHIP_WORM_EDGES - SHIP_WORM) ; Edges data offset (low) EQUB LO(SHIP_WORM_FACES - SHIP_WORM) ; Faces data offset (low) EQUB 77 ; Max. edge count = (77 - 1) / 4 = 19 EQUB 0 ; Gun vertex = 0 EQUB 18 ; Explosion count = 3, as (4 * n) + 6 = 18 EQUB 60 ; Number of vertices = 60 / 6 = 10 EQUB 16 ; Number of edges = 16 EQUW 0 ; Bounty = 0 EQUB 32 ; Number of faces = 32 / 4 = 8 EQUB 19 ; Visibility distance = 19 EQUB 30 ; Max. energy = 30 EQUB 23 ; Max. speed = 23 EQUB HI(SHIP_WORM_EDGES - SHIP_WORM) ; Edges data offset (high) EQUB HI(SHIP_WORM_FACES - SHIP_WORM) ; Faces data offset (high) EQUB 3 ; Normals are scaled by = 2^3 = 8 EQUB %00001000 ; Laser power = 1 ; Missiles = 0 .SHIP_WORM_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 10, -10, 35, 2, 0, 7, 7, 31 ; Vertex 0 VERTEX -10, -10, 35, 3, 0, 7, 7, 31 ; Vertex 1 VERTEX 5, 6, 15, 1, 0, 4, 2, 31 ; Vertex 2 VERTEX -5, 6, 15, 1, 0, 5, 3, 31 ; Vertex 3 VERTEX 15, -10, 25, 4, 2, 7, 7, 31 ; Vertex 4 VERTEX -15, -10, 25, 5, 3, 7, 7, 31 ; Vertex 5 VERTEX 26, -10, -25, 6, 4, 7, 7, 31 ; Vertex 6 VERTEX -26, -10, -25, 6, 5, 7, 7, 31 ; Vertex 7 VERTEX 8, 14, -25, 4, 1, 6, 6, 31 ; Vertex 8 VERTEX -8, 14, -25, 5, 1, 6, 6, 31 ; Vertex 9 .SHIP_WORM_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 7, 0, 31 ; Edge 0 EDGE 1, 5, 7, 3, 31 ; Edge 1 EDGE 5, 7, 7, 5, 31 ; Edge 2 EDGE 7, 6, 7, 6, 31 ; Edge 3 EDGE 6, 4, 7, 4, 31 ; Edge 4 EDGE 4, 0, 7, 2, 31 ; Edge 5 EDGE 0, 2, 2, 0, 31 ; Edge 6 EDGE 1, 3, 3, 0, 31 ; Edge 7 EDGE 4, 2, 4, 2, 31 ; Edge 8 EDGE 5, 3, 5, 3, 31 ; Edge 9 EDGE 2, 8, 4, 1, 31 ; Edge 10 EDGE 8, 6, 6, 4, 31 ; Edge 11 EDGE 3, 9, 5, 1, 31 ; Edge 12 EDGE 9, 7, 6, 5, 31 ; Edge 13 EDGE 2, 3, 1, 0, 31 ; Edge 14 EDGE 8, 9, 6, 1, 31 ; Edge 15 .SHIP_WORM_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 88, 70, 31 ; Face 0 FACE 0, 69, 14, 31 ; Face 1 FACE 70, 66, 35, 31 ; Face 2 FACE -70, 66, 35, 31 ; Face 3 FACE 64, 49, 14, 31 ; Face 4 FACE -64, 49, 14, 31 ; Face 5 FACE 0, 0, -200, 31 ; Face 6 FACE 0, -80, 0, 31 ; Face 7
Name: SHIP_COBRA_MK_3_P [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Cobra Mk III (pirate) Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_COBRA_MK_3_P * XX21 uses SHIP_COBRA_MK_3_P
.SHIP_COBRA_MK_3_P EQUB 1 ; Max. canisters on demise = 1 EQUW 95 * 95 ; Targetable area = 95 * 95 EQUB LO(SHIP_COBRA_MK_3_P_EDGES - SHIP_COBRA_MK_3_P) ; Edges data offset (low) EQUB LO(SHIP_COBRA_MK_3_P_FACES - SHIP_COBRA_MK_3_P) ; Faces data offset (low) EQUB 157 ; Max. edge count = (157 - 1) / 4 = 39 EQUB 84 ; Gun vertex = 84 / 4 = 21 EQUB 42 ; Explosion count = 9, as (4 * n) + 6 = 42 EQUB 168 ; Number of vertices = 168 / 6 = 28 EQUB 38 ; Number of edges = 38 EQUW 175 ; Bounty = 175 EQUB 52 ; Number of faces = 52 / 4 = 13 EQUB 50 ; Visibility distance = 50 EQUB 150 ; Max. energy = 150 EQUB 28 ; Max. speed = 28 EQUB HI(SHIP_COBRA_MK_3_P_EDGES - SHIP_COBRA_MK_3_P) ; Edges data offset (high) EQUB HI(SHIP_COBRA_MK_3_P_FACES - SHIP_COBRA_MK_3_P) ; Faces data offset (high) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00010010 ; Laser power = 2 ; Missiles = 2 .SHIP_COBRA_MK_3_P_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 32, 0, 76, 15, 15, 15, 15, 31 ; Vertex 0 VERTEX -32, 0, 76, 15, 15, 15, 15, 31 ; Vertex 1 VERTEX 0, 26, 24, 15, 15, 15, 15, 31 ; Vertex 2 VERTEX -120, -3, -8, 3, 7, 10, 10, 31 ; Vertex 3 VERTEX 120, -3, -8, 4, 8, 12, 12, 31 ; Vertex 4 VERTEX -88, 16, -40, 15, 15, 15, 15, 31 ; Vertex 5 VERTEX 88, 16, -40, 15, 15, 15, 15, 31 ; Vertex 6 VERTEX 128, -8, -40, 8, 9, 12, 12, 31 ; Vertex 7 VERTEX -128, -8, -40, 7, 9, 10, 10, 31 ; Vertex 8 VERTEX 0, 26, -40, 5, 6, 9, 9, 31 ; Vertex 9 VERTEX -32, -24, -40, 9, 10, 11, 11, 31 ; Vertex 10 VERTEX 32, -24, -40, 9, 11, 12, 12, 31 ; Vertex 11 VERTEX -36, 8, -40, 9, 9, 9, 9, 20 ; Vertex 12 VERTEX -8, 12, -40, 9, 9, 9, 9, 20 ; Vertex 13 VERTEX 8, 12, -40, 9, 9, 9, 9, 20 ; Vertex 14 VERTEX 36, 8, -40, 9, 9, 9, 9, 20 ; Vertex 15 VERTEX 36, -12, -40, 9, 9, 9, 9, 20 ; Vertex 16 VERTEX 8, -16, -40, 9, 9, 9, 9, 20 ; Vertex 17 VERTEX -8, -16, -40, 9, 9, 9, 9, 20 ; Vertex 18 VERTEX -36, -12, -40, 9, 9, 9, 9, 20 ; Vertex 19 VERTEX 0, 0, 76, 0, 11, 11, 11, 6 ; Vertex 20 VERTEX 0, 0, 90, 0, 11, 11, 11, 31 ; Vertex 21 VERTEX -80, -6, -40, 9, 9, 9, 9, 8 ; Vertex 22 VERTEX -80, 6, -40, 9, 9, 9, 9, 8 ; Vertex 23 VERTEX -88, 0, -40, 9, 9, 9, 9, 6 ; Vertex 24 VERTEX 80, 6, -40, 9, 9, 9, 9, 8 ; Vertex 25 VERTEX 88, 0, -40, 9, 9, 9, 9, 6 ; Vertex 26 VERTEX 80, -6, -40, 9, 9, 9, 9, 8 ; Vertex 27 .SHIP_COBRA_MK_3_P_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 0, 11, 31 ; Edge 0 EDGE 0, 4, 4, 12, 31 ; Edge 1 EDGE 1, 3, 3, 10, 31 ; Edge 2 EDGE 3, 8, 7, 10, 31 ; Edge 3 EDGE 4, 7, 8, 12, 31 ; Edge 4 EDGE 6, 7, 8, 9, 31 ; Edge 5 EDGE 6, 9, 6, 9, 31 ; Edge 6 EDGE 5, 9, 5, 9, 31 ; Edge 7 EDGE 5, 8, 7, 9, 31 ; Edge 8 EDGE 2, 5, 1, 5, 31 ; Edge 9 EDGE 2, 6, 2, 6, 31 ; Edge 10 EDGE 3, 5, 3, 7, 31 ; Edge 11 EDGE 4, 6, 4, 8, 31 ; Edge 12 EDGE 1, 2, 0, 1, 31 ; Edge 13 EDGE 0, 2, 0, 2, 31 ; Edge 14 EDGE 8, 10, 9, 10, 31 ; Edge 15 EDGE 10, 11, 9, 11, 31 ; Edge 16 EDGE 7, 11, 9, 12, 31 ; Edge 17 EDGE 1, 10, 10, 11, 31 ; Edge 18 EDGE 0, 11, 11, 12, 31 ; Edge 19 EDGE 1, 5, 1, 3, 29 ; Edge 20 EDGE 0, 6, 2, 4, 29 ; Edge 21 EDGE 20, 21, 0, 11, 6 ; Edge 22 EDGE 12, 13, 9, 9, 20 ; Edge 23 EDGE 18, 19, 9, 9, 20 ; Edge 24 EDGE 14, 15, 9, 9, 20 ; Edge 25 EDGE 16, 17, 9, 9, 20 ; Edge 26 EDGE 15, 16, 9, 9, 19 ; Edge 27 EDGE 14, 17, 9, 9, 17 ; Edge 28 EDGE 13, 18, 9, 9, 19 ; Edge 29 EDGE 12, 19, 9, 9, 19 ; Edge 30 EDGE 2, 9, 5, 6, 30 ; Edge 31 EDGE 22, 24, 9, 9, 6 ; Edge 32 EDGE 23, 24, 9, 9, 6 ; Edge 33 EDGE 22, 23, 9, 9, 8 ; Edge 34 EDGE 25, 26, 9, 9, 6 ; Edge 35 EDGE 26, 27, 9, 9, 6 ; Edge 36 EDGE 25, 27, 9, 9, 8 ; Edge 37 .SHIP_COBRA_MK_3_P_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 62, 31, 31 ; Face 0 FACE -18, 55, 16, 31 ; Face 1 FACE 18, 55, 16, 31 ; Face 2 FACE -16, 52, 14, 31 ; Face 3 FACE 16, 52, 14, 31 ; Face 4 FACE -14, 47, 0, 31 ; Face 5 FACE 14, 47, 0, 31 ; Face 6 FACE -61, 102, 0, 31 ; Face 7 FACE 61, 102, 0, 31 ; Face 8 FACE 0, 0, -80, 31 ; Face 9 FACE -7, -42, 9, 31 ; Face 10 FACE 0, -30, 6, 31 ; Face 11 FACE 7, -42, 9, 31 ; Face 12
Name: SHIP_ASP_MK_2 [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for an Asp Mk II Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_ASP_MK_2 * XX21 uses SHIP_ASP_MK_2
.SHIP_ASP_MK_2 EQUB 0 ; Max. canisters on demise = 0 EQUW 60 * 60 ; Targetable area = 60 * 60 EQUB LO(SHIP_ASP_MK_2_EDGES - SHIP_ASP_MK_2) ; Edges data offset (low) EQUB LO(SHIP_ASP_MK_2_FACES - SHIP_ASP_MK_2) ; Faces data offset (low) EQUB 105 ; Max. edge count = (105 - 1) / 4 = 26 EQUB 32 ; Gun vertex = 32 / 4 = 8 EQUB 26 ; Explosion count = 5, as (4 * n) + 6 = 26 EQUB 114 ; Number of vertices = 114 / 6 = 19 EQUB 28 ; Number of edges = 28 EQUW 200 ; Bounty = 200 EQUB 48 ; Number of faces = 48 / 4 = 12 EQUB 40 ; Visibility distance = 40 EQUB 150 ; Max. energy = 150 EQUB 40 ; Max. speed = 40 EQUB HI(SHIP_ASP_MK_2_EDGES - SHIP_ASP_MK_2) ; Edges data offset (high) EQUB HI(SHIP_ASP_MK_2_FACES - SHIP_ASP_MK_2) ; Faces data offset (high) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00101001 ; Laser power = 5 ; Missiles = 1 .SHIP_ASP_MK_2_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, -18, 0, 1, 0, 2, 2, 22 ; Vertex 0 VERTEX 0, -9, -45, 2, 1, 11, 11, 31 ; Vertex 1 VERTEX 43, 0, -45, 6, 1, 11, 11, 31 ; Vertex 2 VERTEX 69, -3, 0, 6, 1, 9, 7, 31 ; Vertex 3 VERTEX 43, -14, 28, 1, 0, 7, 7, 31 ; Vertex 4 VERTEX -43, 0, -45, 5, 2, 11, 11, 31 ; Vertex 5 VERTEX -69, -3, 0, 5, 2, 10, 8, 31 ; Vertex 6 VERTEX -43, -14, 28, 2, 0, 8, 8, 31 ; Vertex 7 VERTEX 26, -7, 73, 4, 0, 9, 7, 31 ; Vertex 8 VERTEX -26, -7, 73, 4, 0, 10, 8, 31 ; Vertex 9 VERTEX 43, 14, 28, 4, 3, 9, 6, 31 ; Vertex 10 VERTEX -43, 14, 28, 4, 3, 10, 5, 31 ; Vertex 11 VERTEX 0, 9, -45, 5, 3, 11, 6, 31 ; Vertex 12 VERTEX -17, 0, -45, 11, 11, 11, 11, 10 ; Vertex 13 VERTEX 17, 0, -45, 11, 11, 11, 11, 9 ; Vertex 14 VERTEX 0, -4, -45, 11, 11, 11, 11, 10 ; Vertex 15 VERTEX 0, 4, -45, 11, 11, 11, 11, 8 ; Vertex 16 VERTEX 0, -7, 73, 4, 0, 4, 0, 10 ; Vertex 17 VERTEX 0, -7, 83, 4, 0, 4, 0, 10 ; Vertex 18 .SHIP_ASP_MK_2_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 2, 1, 22 ; Edge 0 EDGE 0, 4, 1, 0, 22 ; Edge 1 EDGE 0, 7, 2, 0, 22 ; Edge 2 EDGE 1, 2, 11, 1, 31 ; Edge 3 EDGE 2, 3, 6, 1, 31 ; Edge 4 EDGE 3, 8, 9, 7, 16 ; Edge 5 EDGE 8, 9, 4, 0, 31 ; Edge 6 EDGE 6, 9, 10, 8, 16 ; Edge 7 EDGE 5, 6, 5, 2, 31 ; Edge 8 EDGE 1, 5, 11, 2, 31 ; Edge 9 EDGE 3, 4, 7, 1, 31 ; Edge 10 EDGE 4, 8, 7, 0, 31 ; Edge 11 EDGE 6, 7, 8, 2, 31 ; Edge 12 EDGE 7, 9, 8, 0, 31 ; Edge 13 EDGE 2, 12, 11, 6, 31 ; Edge 14 EDGE 5, 12, 11, 5, 31 ; Edge 15 EDGE 10, 12, 6, 3, 22 ; Edge 16 EDGE 11, 12, 5, 3, 22 ; Edge 17 EDGE 10, 11, 4, 3, 22 ; Edge 18 EDGE 6, 11, 10, 5, 31 ; Edge 19 EDGE 9, 11, 10, 4, 31 ; Edge 20 EDGE 3, 10, 9, 6, 31 ; Edge 21 EDGE 8, 10, 9, 4, 31 ; Edge 22 EDGE 13, 15, 11, 11, 10 ; Edge 23 EDGE 15, 14, 11, 11, 9 ; Edge 24 EDGE 14, 16, 11, 11, 8 ; Edge 25 EDGE 16, 13, 11, 11, 8 ; Edge 26 EDGE 18, 17, 4, 0, 10 ; Edge 27 .SHIP_ASP_MK_2_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, -35, 5, 31 ; Face 0 FACE 8, -38, -7, 31 ; Face 1 FACE -8, -38, -7, 31 ; Face 2 FACE 0, 24, -1, 22 ; Face 3 FACE 0, 43, 19, 31 ; Face 4 FACE -6, 28, -2, 31 ; Face 5 FACE 6, 28, -2, 31 ; Face 6 FACE 59, -64, 31, 31 ; Face 7 FACE -59, -64, 31, 31 ; Face 8 FACE 80, 46, 50, 31 ; Face 9 FACE -80, 46, 50, 31 ; Face 10 FACE 0, 0, -90, 31 ; Face 11 EQUB $00, $FF ; These bytes appear to be unused EQUB $FF, $00
Name: SHIP_PYTHON_P [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Python (pirate) Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_PYTHON_P * XX21 uses SHIP_PYTHON_P
.SHIP_PYTHON_P EQUB 2 ; Max. canisters on demise = 2 EQUW 80 * 80 ; Targetable area = 80 * 80 EQUB LO(SHIP_PYTHON_P_EDGES - SHIP_PYTHON_P) ; Edges data offset (low) EQUB LO(SHIP_PYTHON_P_FACES - SHIP_PYTHON_P) ; Faces data offset (low) EQUB 89 ; Max. edge count = (89 - 1) / 4 = 22 EQUB 0 ; Gun vertex = 0 EQUB 42 ; Explosion count = 9, as (4 * n) + 6 = 42 EQUB 66 ; Number of vertices = 66 / 6 = 11 EQUB 26 ; Number of edges = 26 EQUW 200 ; Bounty = 200 EQUB 52 ; Number of faces = 52 / 4 = 13 EQUB 40 ; Visibility distance = 40 EQUB 250 ; Max. energy = 250 EQUB 20 ; Max. speed = 20 EQUB HI(SHIP_PYTHON_P_EDGES - SHIP_PYTHON_P) ; Edges data offset (high) EQUB HI(SHIP_PYTHON_P_FACES - SHIP_PYTHON_P) ; Faces data offset (high) EQUB 0 ; Normals are scaled by = 2^0 = 1 EQUB %00011011 ; Laser power = 3 ; Missiles = 3 .SHIP_PYTHON_P_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 0, 224, 0, 1, 2, 3, 31 ; Vertex 0 VERTEX 0, 48, 48, 0, 1, 4, 5, 31 ; Vertex 1 VERTEX 96, 0, -16, 15, 15, 15, 15, 31 ; Vertex 2 VERTEX -96, 0, -16, 15, 15, 15, 15, 31 ; Vertex 3 VERTEX 0, 48, -32, 4, 5, 8, 9, 31 ; Vertex 4 VERTEX 0, 24, -112, 9, 8, 12, 12, 31 ; Vertex 5 VERTEX -48, 0, -112, 8, 11, 12, 12, 31 ; Vertex 6 VERTEX 48, 0, -112, 9, 10, 12, 12, 31 ; Vertex 7 VERTEX 0, -48, 48, 2, 3, 6, 7, 31 ; Vertex 8 VERTEX 0, -48, -32, 6, 7, 10, 11, 31 ; Vertex 9 VERTEX 0, -24, -112, 10, 11, 12, 12, 31 ; Vertex 10 .SHIP_PYTHON_P_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 8, 2, 3, 31 ; Edge 0 EDGE 0, 3, 0, 2, 31 ; Edge 1 EDGE 0, 2, 1, 3, 31 ; Edge 2 EDGE 0, 1, 0, 1, 31 ; Edge 3 EDGE 2, 4, 9, 5, 31 ; Edge 4 EDGE 1, 2, 1, 5, 31 ; Edge 5 EDGE 2, 8, 7, 3, 31 ; Edge 6 EDGE 1, 3, 0, 4, 31 ; Edge 7 EDGE 3, 8, 2, 6, 31 ; Edge 8 EDGE 2, 9, 7, 10, 31 ; Edge 9 EDGE 3, 4, 4, 8, 31 ; Edge 10 EDGE 3, 9, 6, 11, 31 ; Edge 11 EDGE 3, 5, 8, 8, 7 ; Edge 12 EDGE 3, 10, 11, 11, 7 ; Edge 13 EDGE 2, 5, 9, 9, 7 ; Edge 14 EDGE 2, 10, 10, 10, 7 ; Edge 15 EDGE 2, 7, 9, 10, 31 ; Edge 16 EDGE 3, 6, 8, 11, 31 ; Edge 17 EDGE 5, 6, 8, 12, 31 ; Edge 18 EDGE 5, 7, 9, 12, 31 ; Edge 19 EDGE 7, 10, 12, 10, 31 ; Edge 20 EDGE 6, 10, 11, 12, 31 ; Edge 21 EDGE 4, 5, 8, 9, 31 ; Edge 22 EDGE 9, 10, 10, 11, 31 ; Edge 23 EDGE 1, 4, 4, 5, 31 ; Edge 24 EDGE 8, 9, 6, 7, 31 ; Edge 25 .SHIP_PYTHON_P_FACES ; normal_x, normal_y, normal_z, visibility FACE -27, 40, 11, 31 ; Face 0 FACE 27, 40, 11, 31 ; Face 1 FACE -27, -40, 11, 31 ; Face 2 FACE 27, -40, 11, 31 ; Face 3 FACE -19, 38, 0, 31 ; Face 4 FACE 19, 38, 0, 31 ; Face 5 FACE -19, -38, 0, 31 ; Face 6 FACE 19, -38, 0, 31 ; Face 7 FACE -25, 37, -11, 31 ; Face 8 FACE 25, 37, -11, 31 ; Face 9 FACE 25, -37, -11, 31 ; Face 10 FACE -25, -37, -11, 31 ; Face 11 FACE 0, 0, -112, 31 ; Face 12
Name: SHIP_FER_DE_LANCE [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Fer-de-Lance Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_FER_DE_LANCE * XX21 uses SHIP_FER_DE_LANCE
.SHIP_FER_DE_LANCE EQUB 0 ; Max. canisters on demise = 0 EQUW 40 * 40 ; Targetable area = 40 * 40 EQUB LO(SHIP_FER_DE_LANCE_EDGES - SHIP_FER_DE_LANCE) ; Edges data offset (low) EQUB LO(SHIP_FER_DE_LANCE_FACES - SHIP_FER_DE_LANCE) ; Faces data offset (low) EQUB 109 ; Max. edge count = (109 - 1) / 4 = 27 EQUB 0 ; Gun vertex = 0 EQUB 26 ; Explosion count = 5, as (4 * n) + 6 = 26 EQUB 114 ; Number of vertices = 114 / 6 = 19 EQUB 27 ; Number of edges = 27 EQUW 0 ; Bounty = 0 EQUB 40 ; Number of faces = 40 / 4 = 10 EQUB 40 ; Visibility distance = 40 EQUB 160 ; Max. energy = 160 EQUB 30 ; Max. speed = 30 EQUB HI(SHIP_FER_DE_LANCE_EDGES - SHIP_FER_DE_LANCE) ; Edges data offset (high) EQUB HI(SHIP_FER_DE_LANCE_FACES - SHIP_FER_DE_LANCE) ; Faces data offset (high) EQUB 1 ; Normals are scaled by = 2^1 = 2 EQUB %00010010 ; Laser power = 2 ; Missiles = 2 .SHIP_FER_DE_LANCE_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, -14, 108, 1, 0, 9, 5, 31 ; Vertex 0 VERTEX -40, -14, -4, 2, 1, 9, 9, 31 ; Vertex 1 VERTEX -12, -14, -52, 3, 2, 9, 9, 31 ; Vertex 2 VERTEX 12, -14, -52, 4, 3, 9, 9, 31 ; Vertex 3 VERTEX 40, -14, -4, 5, 4, 9, 9, 31 ; Vertex 4 VERTEX -40, 14, -4, 1, 0, 6, 2, 28 ; Vertex 5 VERTEX -12, 2, -52, 3, 2, 7, 6, 28 ; Vertex 6 VERTEX 12, 2, -52, 4, 3, 8, 7, 28 ; Vertex 7 VERTEX 40, 14, -4, 4, 0, 8, 5, 28 ; Vertex 8 VERTEX 0, 18, -20, 6, 0, 8, 7, 15 ; Vertex 9 VERTEX -3, -11, 97, 0, 0, 0, 0, 11 ; Vertex 10 VERTEX -26, 8, 18, 0, 0, 0, 0, 9 ; Vertex 11 VERTEX -16, 14, -4, 0, 0, 0, 0, 11 ; Vertex 12 VERTEX 3, -11, 97, 0, 0, 0, 0, 11 ; Vertex 13 VERTEX 26, 8, 18, 0, 0, 0, 0, 9 ; Vertex 14 VERTEX 16, 14, -4, 0, 0, 0, 0, 11 ; Vertex 15 VERTEX 0, -14, -20, 9, 9, 9, 9, 12 ; Vertex 16 VERTEX -14, -14, 44, 9, 9, 9, 9, 12 ; Vertex 17 VERTEX 14, -14, 44, 9, 9, 9, 9, 12 ; Vertex 18 .SHIP_FER_DE_LANCE_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 9, 1, 31 ; Edge 0 EDGE 1, 2, 9, 2, 31 ; Edge 1 EDGE 2, 3, 9, 3, 31 ; Edge 2 EDGE 3, 4, 9, 4, 31 ; Edge 3 EDGE 0, 4, 9, 5, 31 ; Edge 4 EDGE 0, 5, 1, 0, 28 ; Edge 5 EDGE 5, 6, 6, 2, 28 ; Edge 6 EDGE 6, 7, 7, 3, 28 ; Edge 7 EDGE 7, 8, 8, 4, 28 ; Edge 8 EDGE 0, 8, 5, 0, 28 ; Edge 9 EDGE 5, 9, 6, 0, 15 ; Edge 10 EDGE 6, 9, 7, 6, 11 ; Edge 11 EDGE 7, 9, 8, 7, 11 ; Edge 12 EDGE 8, 9, 8, 0, 15 ; Edge 13 EDGE 1, 5, 2, 1, 14 ; Edge 14 EDGE 2, 6, 3, 2, 14 ; Edge 15 EDGE 3, 7, 4, 3, 14 ; Edge 16 EDGE 4, 8, 5, 4, 14 ; Edge 17 EDGE 10, 11, 0, 0, 8 ; Edge 18 EDGE 11, 12, 0, 0, 9 ; Edge 19 EDGE 10, 12, 0, 0, 11 ; Edge 20 EDGE 13, 14, 0, 0, 8 ; Edge 21 EDGE 14, 15, 0, 0, 9 ; Edge 22 EDGE 13, 15, 0, 0, 11 ; Edge 23 EDGE 16, 17, 9, 9, 12 ; Edge 24 EDGE 16, 18, 9, 9, 12 ; Edge 25 EDGE 17, 18, 9, 9, 8 ; Edge 26 .SHIP_FER_DE_LANCE_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 24, 6, 28 ; Face 0 FACE -68, 0, 24, 31 ; Face 1 FACE -63, 0, -37, 31 ; Face 2 FACE 0, 0, -104, 31 ; Face 3 FACE 63, 0, -37, 31 ; Face 4 FACE 68, 0, 24, 31 ; Face 5 FACE -12, 46, -19, 28 ; Face 6 FACE 0, 45, -22, 28 ; Face 7 FACE 12, 46, -19, 28 ; Face 8 FACE 0, -28, 0, 31 ; Face 9
Name: SHIP_MORAY [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Moray Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_MORAY * XX21 uses SHIP_MORAY
.SHIP_MORAY EQUB 1 ; Max. canisters on demise = 1 EQUW 30 * 30 ; Targetable area = 30 * 30 EQUB LO(SHIP_MORAY_EDGES - SHIP_MORAY) ; Edges data offset (low) EQUB LO(SHIP_MORAY_FACES - SHIP_MORAY) ; Faces data offset (low) EQUB 73 ; Max. edge count = (73 - 1) / 4 = 18 EQUB 0 ; Gun vertex = 0 EQUB 26 ; Explosion count = 5, as (4 * n) + 6 = 26 EQUB 84 ; Number of vertices = 84 / 6 = 14 EQUB 19 ; Number of edges = 19 EQUW 50 ; Bounty = 50 EQUB 36 ; Number of faces = 36 / 4 = 9 EQUB 40 ; Visibility distance = 40 EQUB 100 ; Max. energy = 100 EQUB 25 ; Max. speed = 25 EQUB HI(SHIP_MORAY_EDGES - SHIP_MORAY) ; Edges data offset (high) EQUB HI(SHIP_MORAY_FACES - SHIP_MORAY) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00010000 ; Laser power = 2 ; Missiles = 0 .SHIP_MORAY_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 15, 0, 65, 2, 0, 8, 7, 31 ; Vertex 0 VERTEX -15, 0, 65, 1, 0, 7, 6, 31 ; Vertex 1 VERTEX 0, 18, -40, 15, 15, 15, 15, 17 ; Vertex 2 VERTEX -60, 0, 0, 3, 1, 6, 6, 31 ; Vertex 3 VERTEX 60, 0, 0, 5, 2, 8, 8, 31 ; Vertex 4 VERTEX 30, -27, -10, 5, 4, 8, 7, 24 ; Vertex 5 VERTEX -30, -27, -10, 4, 3, 7, 6, 24 ; Vertex 6 VERTEX -9, -4, -25, 4, 4, 4, 4, 7 ; Vertex 7 VERTEX 9, -4, -25, 4, 4, 4, 4, 7 ; Vertex 8 VERTEX 0, -18, -16, 4, 4, 4, 4, 7 ; Vertex 9 VERTEX 13, 3, 49, 0, 0, 0, 0, 5 ; Vertex 10 VERTEX 6, 0, 65, 0, 0, 0, 0, 5 ; Vertex 11 VERTEX -13, 3, 49, 0, 0, 0, 0, 5 ; Vertex 12 VERTEX -6, 0, 65, 0, 0, 0, 0, 5 ; Vertex 13 .SHIP_MORAY_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 7, 0, 31 ; Edge 0 EDGE 1, 3, 6, 1, 31 ; Edge 1 EDGE 3, 6, 6, 3, 24 ; Edge 2 EDGE 5, 6, 7, 4, 24 ; Edge 3 EDGE 4, 5, 8, 5, 24 ; Edge 4 EDGE 0, 4, 8, 2, 31 ; Edge 5 EDGE 1, 6, 7, 6, 15 ; Edge 6 EDGE 0, 5, 8, 7, 15 ; Edge 7 EDGE 0, 2, 2, 0, 15 ; Edge 8 EDGE 1, 2, 1, 0, 15 ; Edge 9 EDGE 2, 3, 3, 1, 17 ; Edge 10 EDGE 2, 4, 5, 2, 17 ; Edge 11 EDGE 2, 5, 5, 4, 13 ; Edge 12 EDGE 2, 6, 4, 3, 13 ; Edge 13 EDGE 7, 8, 4, 4, 5 ; Edge 14 EDGE 7, 9, 4, 4, 7 ; Edge 15 EDGE 8, 9, 4, 4, 7 ; Edge 16 EDGE 10, 11, 0, 0, 5 ; Edge 17 EDGE 12, 13, 0, 0, 5 ; Edge 18 .SHIP_MORAY_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 43, 7, 31 ; Face 0 FACE -10, 49, 7, 31 ; Face 1 FACE 10, 49, 7, 31 ; Face 2 FACE -59, -28, -101, 24 ; Face 3 FACE 0, -52, -78, 24 ; Face 4 FACE 59, -28, -101, 24 ; Face 5 FACE -72, -99, 50, 31 ; Face 6 FACE 0, -83, 30, 31 ; Face 7 FACE 72, -99, 50, 31 ; Face 8
Name: SHIP_THARGOID [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Thargoid mothership Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_THARGOID * XX21 uses SHIP_THARGOID
.SHIP_THARGOID EQUB 0 ; Max. canisters on demise = 0 EQUW 99 * 99 ; Targetable area = 99 * 99 EQUB LO(SHIP_THARGOID_EDGES - SHIP_THARGOID) ; Edges data offset (low) EQUB LO(SHIP_THARGOID_FACES - SHIP_THARGOID) ; Faces data offset (low) EQUB 105 ; Max. edge count = (105 - 1) / 4 = 26 EQUB 60 ; Gun vertex = 60 / 4 = 15 EQUB 38 ; Explosion count = 8, as (4 * n) + 6 = 38 EQUB 120 ; Number of vertices = 120 / 6 = 20 EQUB 26 ; Number of edges = 26 EQUW 500 ; Bounty = 500 EQUB 40 ; Number of faces = 40 / 4 = 10 EQUB 55 ; Visibility distance = 55 EQUB 240 ; Max. energy = 240 EQUB 39 ; Max. speed = 39 EQUB HI(SHIP_THARGOID_EDGES - SHIP_THARGOID) ; Edges data offset (high) EQUB HI(SHIP_THARGOID_FACES - SHIP_THARGOID) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00010110 ; Laser power = 2 ; Missiles = 6 .SHIP_THARGOID_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 32, -48, 48, 0, 4, 8, 8, 31 ; Vertex 0 VERTEX 32, -68, 0, 0, 1, 4, 4, 31 ; Vertex 1 VERTEX 32, -48, -48, 1, 2, 4, 4, 31 ; Vertex 2 VERTEX 32, 0, -68, 2, 3, 4, 4, 31 ; Vertex 3 VERTEX 32, 48, -48, 3, 4, 5, 5, 31 ; Vertex 4 VERTEX 32, 68, 0, 4, 5, 6, 6, 31 ; Vertex 5 VERTEX 32, 48, 48, 4, 6, 7, 7, 31 ; Vertex 6 VERTEX 32, 0, 68, 4, 7, 8, 8, 31 ; Vertex 7 VERTEX -24, -116, 116, 0, 8, 9, 9, 31 ; Vertex 8 VERTEX -24, -164, 0, 0, 1, 9, 9, 31 ; Vertex 9 VERTEX -24, -116, -116, 1, 2, 9, 9, 31 ; Vertex 10 VERTEX -24, 0, -164, 2, 3, 9, 9, 31 ; Vertex 11 VERTEX -24, 116, -116, 3, 5, 9, 9, 31 ; Vertex 12 VERTEX -24, 164, 0, 5, 6, 9, 9, 31 ; Vertex 13 VERTEX -24, 116, 116, 6, 7, 9, 9, 31 ; Vertex 14 VERTEX -24, 0, 164, 7, 8, 9, 9, 31 ; Vertex 15 VERTEX -24, 64, 80, 9, 9, 9, 9, 30 ; Vertex 16 VERTEX -24, 64, -80, 9, 9, 9, 9, 30 ; Vertex 17 VERTEX -24, -64, -80, 9, 9, 9, 9, 30 ; Vertex 18 VERTEX -24, -64, 80, 9, 9, 9, 9, 30 ; Vertex 19 .SHIP_THARGOID_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 7, 4, 8, 31 ; Edge 0 EDGE 0, 1, 0, 4, 31 ; Edge 1 EDGE 1, 2, 1, 4, 31 ; Edge 2 EDGE 2, 3, 2, 4, 31 ; Edge 3 EDGE 3, 4, 3, 4, 31 ; Edge 4 EDGE 4, 5, 4, 5, 31 ; Edge 5 EDGE 5, 6, 4, 6, 31 ; Edge 6 EDGE 6, 7, 4, 7, 31 ; Edge 7 EDGE 0, 8, 0, 8, 31 ; Edge 8 EDGE 1, 9, 0, 1, 31 ; Edge 9 EDGE 2, 10, 1, 2, 31 ; Edge 10 EDGE 3, 11, 2, 3, 31 ; Edge 11 EDGE 4, 12, 3, 5, 31 ; Edge 12 EDGE 5, 13, 5, 6, 31 ; Edge 13 EDGE 6, 14, 6, 7, 31 ; Edge 14 EDGE 7, 15, 7, 8, 31 ; Edge 15 EDGE 8, 15, 8, 9, 31 ; Edge 16 EDGE 8, 9, 0, 9, 31 ; Edge 17 EDGE 9, 10, 1, 9, 31 ; Edge 18 EDGE 10, 11, 2, 9, 31 ; Edge 19 EDGE 11, 12, 3, 9, 31 ; Edge 20 EDGE 12, 13, 5, 9, 31 ; Edge 21 EDGE 13, 14, 6, 9, 31 ; Edge 22 EDGE 14, 15, 7, 9, 31 ; Edge 23 EDGE 16, 17, 9, 9, 30 ; Edge 24 EDGE 18, 19, 9, 9, 30 ; Edge 25 .SHIP_THARGOID_FACES ; normal_x, normal_y, normal_z, visibility FACE 103, -60, 25, 31 ; Face 0 FACE 103, -60, -25, 31 ; Face 1 FACE 103, -25, -60, 31 ; Face 2 FACE 103, 25, -60, 31 ; Face 3 FACE 64, 0, 0, 31 ; Face 4 FACE 103, 60, -25, 31 ; Face 5 FACE 103, 60, 25, 31 ; Face 6 FACE 103, 25, 60, 31 ; Face 7 FACE 103, -25, 60, 31 ; Face 8 FACE -48, 0, 0, 31 ; Face 9
Name: SHIP_THARGON [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Thargon Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_THARGON * XX21 uses SHIP_THARGON

The ship blueprint for the Thargon reuses the edges data from the cargo canister, so the edges data offset is negative.
.SHIP_THARGON EQUB 0 + (15 << 4) ; Max. canisters on demise = 0 ; Market item when scooped = 15 + 1 = 16 (alien items) EQUW 40 * 40 ; Targetable area = 40 * 40 EQUB LO(SHIP_CANISTER_EDGES - SHIP_THARGON) ; Edges from canister EQUB LO(SHIP_THARGON_FACES - SHIP_THARGON) ; Faces data offset (low) EQUB 69 ; Max. edge count = (69 - 1) / 4 = 17 EQUB 0 ; Gun vertex = 0 EQUB 18 ; Explosion count = 3, as (4 * n) + 6 = 18 EQUB 60 ; Number of vertices = 60 / 6 = 10 EQUB 15 ; Number of edges = 15 EQUW 50 ; Bounty = 50 EQUB 28 ; Number of faces = 28 / 4 = 7 EQUB 20 ; Visibility distance = 20 EQUB 20 ; Max. energy = 20 EQUB 30 ; Max. speed = 30 EQUB HI(SHIP_CANISTER_EDGES - SHIP_THARGON) ; Edges from canister EQUB HI(SHIP_THARGON_FACES - SHIP_THARGON) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00010000 ; Laser power = 2 ; Missiles = 0 .SHIP_THARGON_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX -9, 0, 40, 1, 0, 5, 5, 31 ; Vertex 0 VERTEX -9, -38, 12, 1, 0, 2, 2, 31 ; Vertex 1 VERTEX -9, -24, -32, 2, 0, 3, 3, 31 ; Vertex 2 VERTEX -9, 24, -32, 3, 0, 4, 4, 31 ; Vertex 3 VERTEX -9, 38, 12, 4, 0, 5, 5, 31 ; Vertex 4 VERTEX 9, 0, -8, 5, 1, 6, 6, 31 ; Vertex 5 VERTEX 9, -10, -15, 2, 1, 6, 6, 31 ; Vertex 6 VERTEX 9, -6, -26, 3, 2, 6, 6, 31 ; Vertex 7 VERTEX 9, 6, -26, 4, 3, 6, 6, 31 ; Vertex 8 VERTEX 9, 10, -15, 5, 4, 6, 6, 31 ; Vertex 9 .SHIP_THARGON_FACES ; normal_x, normal_y, normal_z, visibility FACE -36, 0, 0, 31 ; Face 0 FACE 20, -5, 7, 31 ; Face 1 FACE 46, -42, -14, 31 ; Face 2 FACE 36, 0, -104, 31 ; Face 3 FACE 46, 42, -14, 31 ; Face 4 FACE 20, 5, 7, 31 ; Face 5 FACE 36, 0, 0, 31 ; Face 6
Name: SHIP_CONSTRICTOR [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Constrictor Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_CONSTRICTOR * XX21 uses SHIP_CONSTRICTOR
.SHIP_CONSTRICTOR EQUB 3 ; Max. canisters on demise = 3 EQUW 65 * 65 ; Targetable area = 65 * 65 EQUB LO(SHIP_CONSTRICTOR_EDGES - SHIP_CONSTRICTOR) ; Edges data offset (low) EQUB LO(SHIP_CONSTRICTOR_FACES - SHIP_CONSTRICTOR) ; Faces data offset (low) EQUB 81 ; Max. edge count = (81 - 1) / 4 = 20 EQUB 0 ; Gun vertex = 0 EQUB 46 ; Explosion count = 10, as (4 * n) + 6 = 46 EQUB 102 ; Number of vertices = 102 / 6 = 17 EQUB 24 ; Number of edges = 24 EQUW 0 ; Bounty = 0 EQUB 40 ; Number of faces = 40 / 4 = 10 EQUB 45 ; Visibility distance = 45 EQUB 252 ; Max. energy = 252 EQUB 36 ; Max. speed = 36 EQUB HI(SHIP_CONSTRICTOR_EDGES - SHIP_CONSTRICTOR) ; Edges data offset (high) EQUB HI(SHIP_CONSTRICTOR_FACES - SHIP_CONSTRICTOR) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00110100 ; Laser power = 6 ; Missiles = 4 .SHIP_CONSTRICTOR_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 20, -7, 80, 2, 0, 9, 9, 31 ; Vertex 0 VERTEX -20, -7, 80, 1, 0, 9, 9, 31 ; Vertex 1 VERTEX -54, -7, 40, 4, 1, 9, 9, 31 ; Vertex 2 VERTEX -54, -7, -40, 5, 4, 9, 8, 31 ; Vertex 3 VERTEX -20, 13, -40, 6, 5, 8, 8, 31 ; Vertex 4 VERTEX 20, 13, -40, 7, 6, 8, 8, 31 ; Vertex 5 VERTEX 54, -7, -40, 7, 3, 9, 8, 31 ; Vertex 6 VERTEX 54, -7, 40, 3, 2, 9, 9, 31 ; Vertex 7 VERTEX 20, 13, 5, 15, 15, 15, 15, 31 ; Vertex 8 VERTEX -20, 13, 5, 15, 15, 15, 15, 31 ; Vertex 9 VERTEX 20, -7, 62, 9, 9, 9, 9, 18 ; Vertex 10 VERTEX -20, -7, 62, 9, 9, 9, 9, 18 ; Vertex 11 VERTEX 25, -7, -25, 9, 9, 9, 9, 18 ; Vertex 12 VERTEX -25, -7, -25, 9, 9, 9, 9, 18 ; Vertex 13 VERTEX 15, -7, -15, 9, 9, 9, 9, 10 ; Vertex 14 VERTEX -15, -7, -15, 9, 9, 9, 9, 10 ; Vertex 15 VERTEX 0, -7, 0, 15, 9, 1, 0, 0 ; Vertex 16 .SHIP_CONSTRICTOR_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 9, 0, 31 ; Edge 0 EDGE 1, 2, 9, 1, 31 ; Edge 1 EDGE 1, 9, 1, 0, 31 ; Edge 2 EDGE 0, 8, 2, 0, 31 ; Edge 3 EDGE 0, 7, 9, 2, 31 ; Edge 4 EDGE 7, 8, 3, 2, 31 ; Edge 5 EDGE 2, 9, 4, 1, 31 ; Edge 6 EDGE 2, 3, 9, 4, 31 ; Edge 7 EDGE 6, 7, 9, 3, 31 ; Edge 8 EDGE 6, 8, 7, 3, 31 ; Edge 9 EDGE 5, 8, 7, 6, 31 ; Edge 10 EDGE 4, 9, 6, 5, 31 ; Edge 11 EDGE 3, 9, 5, 4, 31 ; Edge 12 EDGE 3, 4, 8, 5, 31 ; Edge 13 EDGE 4, 5, 8, 6, 31 ; Edge 14 EDGE 5, 6, 8, 7, 31 ; Edge 15 EDGE 3, 6, 9, 8, 31 ; Edge 16 EDGE 8, 9, 6, 0, 31 ; Edge 17 EDGE 10, 12, 9, 9, 18 ; Edge 18 EDGE 12, 14, 9, 9, 5 ; Edge 19 EDGE 14, 10, 9, 9, 10 ; Edge 20 EDGE 11, 15, 9, 9, 10 ; Edge 21 EDGE 13, 15, 9, 9, 5 ; Edge 22 EDGE 11, 13, 9, 9, 18 ; Edge 23 .SHIP_CONSTRICTOR_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 55, 15, 31 ; Face 0 FACE -24, 75, 20, 31 ; Face 1 FACE 24, 75, 20, 31 ; Face 2 FACE 44, 75, 0, 31 ; Face 3 FACE -44, 75, 0, 31 ; Face 4 FACE -44, 75, 0, 31 ; Face 5 FACE 0, 53, 0, 31 ; Face 6 FACE 44, 75, 0, 31 ; Face 7 FACE 0, 0, -160, 31 ; Face 8 FACE 0, -27, 0, 31 ; Face 9
Name: SHIP_COUGAR [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Cougar Deep dive: Ship blueprints The elusive Cougar
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_COUGAR * XX21 uses SHIP_COUGAR
.SHIP_COUGAR EQUB 3 ; Max. canisters on demise = 3 EQUW 70 * 70 ; Targetable area = 70 * 70 EQUB LO(SHIP_COUGAR_EDGES - SHIP_COUGAR) ; Edges data offset (low) EQUB LO(SHIP_COUGAR_FACES - SHIP_COUGAR) ; Faces data offset (low) EQUB 105 ; Max. edge count = (105 - 1) / 4 = 26 EQUB 0 ; Gun vertex = 0 EQUB 42 ; Explosion count = 9, as (4 * n) + 6 = 42 EQUB 114 ; Number of vertices = 114 / 6 = 19 EQUB 25 ; Number of edges = 25 EQUW 0 ; Bounty = 0 EQUB 24 ; Number of faces = 24 / 4 = 6 EQUB 34 ; Visibility distance = 34 EQUB 252 ; Max. energy = 252 EQUB 40 ; Max. speed = 40 EQUB HI(SHIP_COUGAR_EDGES - SHIP_COUGAR) ; Edges data offset (high) EQUB HI(SHIP_COUGAR_FACES - SHIP_COUGAR) ; Faces data offset (high) EQUB 2 ; Normals are scaled by = 2^2 = 4 EQUB %00110100 ; Laser power = 6 ; Missiles = 4 .SHIP_COUGAR_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 5, 67, 2, 0, 4, 4, 31 ; Vertex 0 VERTEX -20, 0, 40, 1, 0, 2, 2, 31 ; Vertex 1 VERTEX -40, 0, -40, 1, 0, 5, 5, 31 ; Vertex 2 VERTEX 0, 14, -40, 4, 0, 5, 5, 30 ; Vertex 3 VERTEX 0, -14, -40, 2, 1, 5, 3, 30 ; Vertex 4 VERTEX 20, 0, 40, 3, 2, 4, 4, 31 ; Vertex 5 VERTEX 40, 0, -40, 4, 3, 5, 5, 31 ; Vertex 6 VERTEX -36, 0, 56, 1, 0, 1, 1, 31 ; Vertex 7 VERTEX -60, 0, -20, 1, 0, 1, 1, 31 ; Vertex 8 VERTEX 36, 0, 56, 4, 3, 4, 4, 31 ; Vertex 9 VERTEX 60, 0, -20, 4, 3, 4, 4, 31 ; Vertex 10 VERTEX 0, 7, 35, 0, 0, 4, 4, 18 ; Vertex 11 VERTEX 0, 8, 25, 0, 0, 4, 4, 20 ; Vertex 12 VERTEX -12, 2, 45, 0, 0, 0, 0, 20 ; Vertex 13 VERTEX 12, 2, 45, 4, 4, 4, 4, 20 ; Vertex 14 VERTEX -10, 6, -40, 5, 5, 5, 5, 20 ; Vertex 15 VERTEX -10, -6, -40, 5, 5, 5, 5, 20 ; Vertex 16 VERTEX 10, -6, -40, 5, 5, 5, 5, 20 ; Vertex 17 VERTEX 10, 6, -40, 5, 5, 5, 5, 20 ; Vertex 18 .SHIP_COUGAR_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 2, 0, 31 ; Edge 0 EDGE 1, 7, 1, 0, 31 ; Edge 1 EDGE 7, 8, 1, 0, 31 ; Edge 2 EDGE 8, 2, 1, 0, 31 ; Edge 3 EDGE 2, 3, 5, 0, 30 ; Edge 4 EDGE 3, 6, 5, 4, 30 ; Edge 5 EDGE 2, 4, 5, 1, 30 ; Edge 6 EDGE 4, 6, 5, 3, 30 ; Edge 7 EDGE 6, 10, 4, 3, 31 ; Edge 8 EDGE 10, 9, 4, 3, 31 ; Edge 9 EDGE 9, 5, 4, 3, 31 ; Edge 10 EDGE 5, 0, 4, 2, 31 ; Edge 11 EDGE 0, 3, 4, 0, 27 ; Edge 12 EDGE 1, 4, 2, 1, 27 ; Edge 13 EDGE 5, 4, 3, 2, 27 ; Edge 14 EDGE 1, 2, 1, 0, 26 ; Edge 15 EDGE 5, 6, 4, 3, 26 ; Edge 16 EDGE 12, 13, 0, 0, 20 ; Edge 17 EDGE 13, 11, 0, 0, 18 ; Edge 18 EDGE 11, 14, 4, 4, 18 ; Edge 19 EDGE 14, 12, 4, 4, 20 ; Edge 20 EDGE 15, 16, 5, 5, 18 ; Edge 21 EDGE 16, 18, 5, 5, 20 ; Edge 22 EDGE 18, 17, 5, 5, 18 ; Edge 23 EDGE 17, 15, 5, 5, 20 ; Edge 24 .SHIP_COUGAR_FACES ; normal_x, normal_y, normal_z, visibility FACE -16, 46, 4, 31 ; Face 0 FACE -16, -46, 4, 31 ; Face 1 FACE 0, -27, 5, 31 ; Face 2 FACE 16, -46, 4, 31 ; Face 3 FACE 16, 46, 4, 31 ; Face 4 FACE 0, 0, -160, 30 ; Face 5
Name: SHIP_DODO [Show more] Type: Variable Category: Drawing ships Summary: Ship blueprint for a Dodecahedron ("Dodo") space station Deep dive: Ship blueprints
Context: See this variable on its own page References: This variable is used as follows: * Unused copy of XX21 uses SHIP_DODO * XX21 uses SHIP_DODO
.SHIP_DODO EQUB 0 ; Max. canisters on demise = 0 EQUW 180 * 180 ; Targetable area = 180 * 180 EQUB LO(SHIP_DODO_EDGES - SHIP_DODO) ; Edges data offset (low) EQUB LO(SHIP_DODO_FACES - SHIP_DODO) ; Faces data offset (low) EQUB 101 ; Max. edge count = (101 - 1) / 4 = 25 EQUB 0 ; Gun vertex = 0 EQUB 6 ; Explosion count = 0, as (4 * n) + 6 = 6 EQUB 144 ; Number of vertices = 144 / 6 = 24 EQUB 34 ; Number of edges = 34 EQUW 0 ; Bounty = 0 EQUB 48 ; Number of faces = 48 / 4 = 12 EQUB 125 ; Visibility distance = 125 EQUB 240 ; Max. energy = 240 EQUB 0 ; Max. speed = 0 EQUB HI(SHIP_DODO_EDGES - SHIP_DODO) ; Edges data offset (high) EQUB HI(SHIP_DODO_FACES - SHIP_DODO) ; Faces data offset (high) EQUB 0 ; Normals are scaled by = 2^0 = 1 EQUB %00000000 ; Laser power = 0 ; Missiles = 0 .SHIP_DODO_VERTICES ; x, y, z, face1, face2, face3, face4, visibility VERTEX 0, 150, 196, 1, 0, 5, 5, 31 ; Vertex 0 VERTEX 143, 46, 196, 1, 0, 2, 2, 31 ; Vertex 1 VERTEX 88, -121, 196, 2, 0, 3, 3, 31 ; Vertex 2 VERTEX -88, -121, 196, 3, 0, 4, 4, 31 ; Vertex 3 VERTEX -143, 46, 196, 4, 0, 5, 5, 31 ; Vertex 4 VERTEX 0, 243, 46, 5, 1, 6, 6, 31 ; Vertex 5 VERTEX 231, 75, 46, 2, 1, 7, 7, 31 ; Vertex 6 VERTEX 143, -196, 46, 3, 2, 8, 8, 31 ; Vertex 7 VERTEX -143, -196, 46, 4, 3, 9, 9, 31 ; Vertex 8 VERTEX -231, 75, 46, 5, 4, 10, 10, 31 ; Vertex 9 VERTEX 143, 196, -46, 6, 1, 7, 7, 31 ; Vertex 10 VERTEX 231, -75, -46, 7, 2, 8, 8, 31 ; Vertex 11 VERTEX 0, -243, -46, 8, 3, 9, 9, 31 ; Vertex 12 VERTEX -231, -75, -46, 9, 4, 10, 10, 31 ; Vertex 13 VERTEX -143, 196, -46, 6, 5, 10, 10, 31 ; Vertex 14 VERTEX 88, 121, -196, 7, 6, 11, 11, 31 ; Vertex 15 VERTEX 143, -46, -196, 8, 7, 11, 11, 31 ; Vertex 16 VERTEX 0, -150, -196, 9, 8, 11, 11, 31 ; Vertex 17 VERTEX -143, -46, -196, 10, 9, 11, 11, 31 ; Vertex 18 VERTEX -88, 121, -196, 10, 6, 11, 11, 31 ; Vertex 19 VERTEX -16, 32, 196, 0, 0, 0, 0, 30 ; Vertex 20 VERTEX -16, -32, 196, 0, 0, 0, 0, 30 ; Vertex 21 VERTEX 16, 32, 196, 0, 0, 0, 0, 23 ; Vertex 22 VERTEX 16, -32, 196, 0, 0, 0, 0, 23 ; Vertex 23 .SHIP_DODO_EDGES ; vertex1, vertex2, face1, face2, visibility EDGE 0, 1, 1, 0, 31 ; Edge 0 EDGE 1, 2, 2, 0, 31 ; Edge 1 EDGE 2, 3, 3, 0, 31 ; Edge 2 EDGE 3, 4, 4, 0, 31 ; Edge 3 EDGE 4, 0, 5, 0, 31 ; Edge 4 EDGE 5, 10, 6, 1, 31 ; Edge 5 EDGE 10, 6, 7, 1, 31 ; Edge 6 EDGE 6, 11, 7, 2, 31 ; Edge 7 EDGE 11, 7, 8, 2, 31 ; Edge 8 EDGE 7, 12, 8, 3, 31 ; Edge 9 EDGE 12, 8, 9, 3, 31 ; Edge 10 EDGE 8, 13, 9, 4, 31 ; Edge 11 EDGE 13, 9, 10, 4, 31 ; Edge 12 EDGE 9, 14, 10, 5, 31 ; Edge 13 EDGE 14, 5, 6, 5, 31 ; Edge 14 EDGE 15, 16, 11, 7, 31 ; Edge 15 EDGE 16, 17, 11, 8, 31 ; Edge 16 EDGE 17, 18, 11, 9, 31 ; Edge 17 EDGE 18, 19, 11, 10, 31 ; Edge 18 EDGE 19, 15, 11, 6, 31 ; Edge 19 EDGE 0, 5, 5, 1, 31 ; Edge 20 EDGE 1, 6, 2, 1, 31 ; Edge 21 EDGE 2, 7, 3, 2, 31 ; Edge 22 EDGE 3, 8, 4, 3, 31 ; Edge 23 EDGE 4, 9, 5, 4, 31 ; Edge 24 EDGE 10, 15, 7, 6, 31 ; Edge 25 EDGE 11, 16, 8, 7, 31 ; Edge 26 EDGE 12, 17, 9, 8, 31 ; Edge 27 EDGE 13, 18, 10, 9, 31 ; Edge 28 EDGE 14, 19, 10, 6, 31 ; Edge 29 EDGE 20, 21, 0, 0, 30 ; Edge 30 EDGE 21, 23, 0, 0, 20 ; Edge 31 EDGE 23, 22, 0, 0, 23 ; Edge 32 EDGE 22, 20, 0, 0, 20 ; Edge 33 .SHIP_DODO_FACES ; normal_x, normal_y, normal_z, visibility FACE 0, 0, 196, 31 ; Face 0 FACE 103, 142, 88, 31 ; Face 1 FACE 169, -55, 89, 31 ; Face 2 FACE 0, -176, 88, 31 ; Face 3 FACE -169, -55, 89, 31 ; Face 4 FACE -103, 142, 88, 31 ; Face 5 FACE 0, 176, -88, 31 ; Face 6 FACE 169, 55, -89, 31 ; Face 7 FACE 103, -142, -88, 31 ; Face 8 FACE -103, -142, -88, 31 ; Face 9 FACE -169, 55, -89, 31 ; Face 10 FACE 0, 0, -196, 31 ; Face 11 EQUB $00, $FF ; These bytes appear to be unused EQUB $FF, $00
Name: SHPPT [Show more] Type: Subroutine Category: Drawing ships Summary: Draw a distant ship as a point rather than a full wireframe
Context: See this subroutine on its own page References: This subroutine is called as follows: * LL9 (Part 2 of 12) calls SHPPT
.SHPPT JSR PROJ ; Project the ship onto the screen, returning: ; ; * K3(1 0) = the screen x-coordinate ; * K4(1 0) = the screen y-coordinate ; * A = K4+1 ORA K3+1 ; If either of the high bytes of the screen coordinates BNE nono ; are non-zero, jump to nono as the ship is off-screen LDY K4 ; Set Y = the y-coordinate of the dot CPY #Y*2-2 ; If the y-coordinate is bigger than the y-coordinate of BCS nono ; the bottom of the screen, jump to nono as the ship's ; dot is off the bottom of the space view ; The C flag is clear at this point as we just passed ; through a BCS, so we call Shpt with the C flag clear JSR Shpt ; Call Shpt to draw a horizontal 4-pixel dash for the ; first row of the dot (i.e. a four-pixel dash) INY ; Increment Y to the next row (so this is the second row ; of the two-pixel-high dot) CLC ; Cleat the C flag to pass to Shpt JSR Shpt ; Call Shpt to draw a horizontal 4-pixel dash for the ; second row of the dot (i.e. a four-pixel dash) BIT XX1+31 ; If bit 6 of the ship's byte #31 is clear, then there BVC nono ; are no lasers firing, so jump to nono to record that ; we didn't draw anything and return from the subroutine LDA XX1+31 ; Clear 6 in the ship's byte #31 to denote that there AND #%10111111 ; are no lasers firing (bit 6), as we are about to draw STA XX1+31 ; the laser line and this will ensure it flickers off in ; the next iteration ; We now draw the laser line, from the ship dot at ; (X1, Y1), as set in the call to Shpt, to a point on ; the edge of the screen LDX #1 ; Set X = 1 to use as the x-coordinate for the end of ; the laser line for when z_lo < 128 (so the ship fires ; to our left) LDA XX1+6 ; Set A = z_lo BPL shpt1 ; If z_lo < 128, jump to shpt1 to leave X = 1 LDX #255 ; Set X = 255 to use as the x-coordinate for the end of ; the laser line for when z_lo >= 128 (so the ship fires ; to our left) ; ; This makes the ship fire to our left and right as it ; gets closer to us, as z_lo reduces from 255 to 0 for ; each reduction in z_hi .shpt1 STX X2 ; Set X2 to the x-coordinate of the end of the laser ; line AND #63 ; Set Y2 = z_lo, reduced to the range 0 to 63, plus 32 ADC #32 ; STA Y2 ; So the end of the laser line moves up and down the ; edge of the screen (between y-coordinate 32 and 95) as ; the ship gets closer to us, as z_lo reduces from 255 ; to 0 for each reduction in z_hi JSR LOIN ; Draw the laser line from (X1, Y1) to (X2, Y2) .nono LDA #%11110111 ; Clear bit 3 of the ship's byte #31 to record that AND XX1+31 ; nothing is being drawn on-screen for this ship STA XX1+31 RTS ; Return from the subroutine .Shpt ; This routine draws a horizontal 4-pixel dash, for ; either the top or the bottom of the ship's dot ; ; We always call this routine with the C flag clear LDA K3 ; Set A = screen x-coordinate of the ship dot STA X1 ; Set X1 to the screen x-coordinate of the ship dot ADC #3 ; Set A = screen x-coordinate of the ship dot + 3 ; (this works because we know the C flag is clear) BCS shpt2 ; If the addition overflowed, jump to shpt2 to return ; from the subroutine without drawing the dash STA X2 ; Store the x-coordinate of the ship dot in X1, as this ; is where the dash starts STY Y1 ; Store Y in both y-coordinates, as this is a horizontal STY Y2 ; dash at y-coordinate Y JMP LOIN ; Draw the dash from (X1, Y1) to (X2, Y2), returning ; from the subroutine using a tail call .shpt2 PLA ; Pull the return address from the stack, so the RTS PLA ; below actually returns from the subroutine that called ; LL9 (as we called SHPPT from LL9 with a JMP) JMP nono ; Jump to nono to record that we didn't draw anything ; and return from the subroutine
Name: LL38 [Show more] Type: Subroutine Category: Maths (Arithmetic) Summary: Calculate (S A) = (S R) + (A Q)
Context: See this subroutine on its own page References: This subroutine is called as follows: * LL51 calls LL38 * LL9 (Part 5 of 12) calls LL38

Calculate the following between sign-magnitude numbers: (S A) = (S R) + (A Q) where the sign bytes only contain the sign bits, not magnitudes.
Returns: C flag Set if the addition overflowed, clear otherwise
.LL38 EOR S ; If the sign of A * S is negative, skip to LL35, as BMI LL39 ; A and S have different signs so we need to subtract LDA Q ; Otherwise set A = R + Q, which is the result we need, CLC ; as S already contains the correct sign ADC R RTS ; Return from the subroutine .LL39 LDA R ; Set A = R - Q SEC SBC Q BCC P%+4 ; If the subtraction underflowed, skip the next two ; instructions so we can negate the result CLC ; Otherwise the result is correct, and S contains the ; correct sign of the result as R is the dominant side ; of the subtraction, so clear the C flag RTS ; And return from the subroutine ; If we get here we need to negate both the result and ; the sign in S, as both are the wrong sign .LL40 PHA ; Store the result of the subtraction on the stack LDA S ; Flip the sign of S EOR #%10000000 STA S PLA ; Restore the subtraction result into A EOR #%11111111 ; Negate the result in A using two's complement, i.e. ADC #1 ; set A = ~A + 1 RTS ; Return from the subroutine
Name: LL51 [Show more] Type: Subroutine Category: Maths (Geometry) Summary: Calculate the dot product of XX15 and XX16
Context: See this subroutine on its own page References: This subroutine is called as follows: * LL9 (Part 5 of 12) calls LL51 * LL9 (Part 6 of 12) calls LL51

Calculate the following dot products: XX12(1 0) = XX15(5 0) . XX16(5 0) XX12(3 2) = XX15(5 0) . XX16(11 6) XX12(5 4) = XX15(5 0) . XX16(12 17) storing the results as sign-magnitude numbers in XX12 through XX12+5. When called from part 5 of LL9, XX12 contains the vector [x y z] to the ship we're drawing, and XX16 contains the orientation vectors, so it returns: [ x ] [ sidev_x ] [ x ] [ roofv_x ] [ x ] [ nosev_x ] [ y ] . [ sidev_y ] [ y ] . [ roofv_y ] [ y ] . [ nosev_y ] [ z ] [ sidev_z ] [ z ] [ roofv_z ] [ z ] [ nosev_z ] When called from part 6 of LL9, XX12 contains the vector [x y z] of the vertex we're analysing, and XX16 contains the transposed orientation vectors with each of them containing the x, y and z elements of the original vectors, so it
Returns: [ x ] [ sidev_x ] [ x ] [ sidev_y ] [ x ] [ sidev_z ] [ y ] . [ roofv_x ] [ y ] . [ roofv_y ] [ y ] . [ roofv_z ] [ z ] [ nosev_x ] [ z ] [ nosev_y ] [ z ] [ nosev_z ]
Arguments: XX15(1 0) The ship (or vertex)'s x-coordinate as (x_sign x_lo) XX15(3 2) The ship (or vertex)'s y-coordinate as (y_sign y_lo) XX15(5 4) The ship (or vertex)'s z-coordinate as (z_sign z_lo) XX16 to XX16+5 The scaled sidev (or _x) vector, with: * x, y, z magnitudes in XX16, XX16+2, XX16+4 * x, y, z signs in XX16+1, XX16+3, XX16+5 XX16+6 to XX16+11 The scaled roofv (or _y) vector, with: * x, y, z magnitudes in XX16+6, XX16+8, XX16+10 * x, y, z signs in XX16+7, XX16+9, XX16+11 XX16+12 to XX16+17 The scaled nosev (or _z) vector, with: * x, y, z magnitudes in XX16+12, XX16+14, XX16+16 * x, y, z signs in XX16+13, XX16+15, XX16+17
Returns: XX12(1 0) The dot product of [x y z] vector with the sidev (or _x) vector, with the sign in XX12+1 and magnitude in XX12 XX12(3 2) The dot product of [x y z] vector with the roofv (or _y) vector, with the sign in XX12+3 and magnitude in XX12+2 XX12(5 4) The dot product of [x y z] vector with the nosev (or _z) vector, with the sign in XX12+5 and magnitude in XX12+4
.LL51 SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 LDX #0 ; Set X = 0, which will contain the offset of the vector ; to use in the calculation, increasing by 6 for each ; new vector LDY #0 ; Set Y = 0, which will contain the offset of the ; result bytes in XX12, increasing by 2 for each new ; result .ll51 LDA XX15 ; Set Q = x_lo STA Q LDA XX16,X ; Set A = |sidev_x| JSR FMLTU ; Set T = A * Q / 256 STA T ; = |sidev_x| * x_lo / 256 LDA XX15+1 ; Set S to the sign of x_sign * sidev_x EOR XX16+1,X STA S LDA XX15+2 ; Set Q = y_lo STA Q LDA XX16+2,X ; Set A = |sidev_y| JSR FMLTU ; Set Q = A * Q / 256 STA Q ; = |sidev_y| * y_lo / 256 LDA T ; Set R = T STA R ; = |sidev_x| * x_lo / 256 LDA XX15+3 ; Set A to the sign of y_sign * sidev_y EOR XX16+3,X JSR LL38 ; Set (S T) = (S R) + (A Q) STA T ; = |sidev_x| * x_lo + |sidev_y| * y_lo LDA XX15+4 ; Set Q = z_lo STA Q LDA XX16+4,X ; Set A = |sidev_z| JSR FMLTU ; Set Q = A * Q / 256 STA Q ; = |sidev_z| * z_lo / 256 LDA T ; Set R = T STA R ; = |sidev_x| * x_lo + |sidev_y| * y_lo LDA XX15+5 ; Set A to the sign of z_sign * sidev_z EOR XX16+5,X JSR LL38 ; Set (S A) = (S R) + (A Q) ; = |sidev_x| * x_lo + |sidev_y| * y_lo ; + |sidev_z| * z_lo STA XX12,Y ; Store the result in XX12+Y(1 0), starting with the low ; byte SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 LDA S ; And then the high byte STA XX12+1,Y INY ; Set Y = Y + 2 INY TXA ; Set X = X + 6 CLC ADC #6 TAX CMP #17 ; If X < 17, loop back to ll51 for the next vector BCC ll51 RTS ; Return from the subroutine
Name: LL9 (Part 1 of 12) [Show more] Type: Subroutine Category: Drawing ships Summary: Draw ship: Check if ship is exploding, check if ship is in front Deep dive: Drawing ships
Context: See this subroutine on its own page References: This subroutine is called as follows: * HAS1 calls LL9 * LL9_b1 calls LL9

This routine draws the current ship on the screen. This part checks to see if the ship is exploding, or if it should start exploding, and if it does it sets things up accordingly. In this code, XX1 is used to point to the current ship's data block at INWK (the two labels are interchangeable).
Arguments: XX1 XX1 shares its location with INWK, which contains the zero-page copy of the data block for this ship from the K% workspace INF The address of the data block for this ship in workspace K% XX0 The address of the blueprint for this ship
Other entry points: EE51 Remove the current ship from the screen, called from SHPPT before drawing the ship as a point
.LL25 JMP PLANET ; Jump to the PLANET routine, returning from the ; subroutine using a tail call .LL9 SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 LDA TYPE ; If the ship type is negative then this indicates a BMI LL25 ; planet or sun, so jump to PLANET via LL25 above LDA #31 ; Set XX4 = 31 to store the ship's distance for later STA XX4 ; comparison with the visibility distance. We will ; update this value below with the actual ship's ; distance if it turns out to be visible on-screen LDA NEWB ; If bit 7 of the ship's NEWB flags is set, then the BMI EE51 ; ship has been scooped or has docked, so jump down to ; EE51 to skip drawing the ship so it doesn't appear ; on-screen LDA #%00100000 ; If bit 5 of the ship's byte #31 is set, then the ship BIT XX1+31 ; is currently exploding, so jump down to EE28 BNE EE28 BPL EE28 ; If bit 7 of the ship's byte #31 is clear then the ship ; has not just been killed, so jump down to EE28 ; Otherwise bit 5 is clear and bit 7 is set, so the ship ; is not yet exploding but it has been killed, so we ; need to start an explosion ORA XX1+31 ; Clear bits 6 and 7 of the ship's byte #31, to stop the AND #%00111111 ; ship from firing its laser and to mark it as no longer STA XX1+31 ; having just been killed LDA #0 ; Set the ship's acceleration in byte #31 to 0, updating LDY #28 ; the byte in the workspace K% data block so we don't STA (INF),Y ; have to copy it back from INWK later LDY #30 ; Set the ship's pitch counter in byte #30 to 0, to stop STA (INF),Y ; the ship from pitching JSR HideShip ; Update the ship so it is no longer shown on the ; scanner LDA #18 ; Set the explosion cloud counter in INWK+34 to 18 so we STA INWK+34 ; can use it in DOEXP when drawing the explosion cloud LDY #37 ; Set byte #37 of the ship's data block to a random JSR DORND ; number to use as a random number seed value for STA (INF),Y ; generating the explosion cloud INY ; Set byte #38 of the ship's data block to a random JSR DORND ; number to use as a random number seed value for STA (INF),Y ; generating the explosion cloud INY ; Set byte #39 of the ship's data block to a random JSR DORND ; number to use as a random number seed value for STA (INF),Y ; generating the explosion cloud INY ; Set byte #40 of the ship's data block to a random JSR DORND ; number to use as a random number seed value for STA (INF),Y ; generating the explosion cloud SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 .EE28 LDA XX1+8 ; Set A = z_sign .EE49 BPL LL10 ; If A is positive, i.e. the ship is in front of us, ; jump down to LL10 .LL14 ; If we get here then we do not draw the ship on-screen, ; for example when the ship is no longer on-screen, or ; is too far away to be fully drawn, and so on LDA XX1+31 ; If bit 5 of the ship's byte #31 is clear, then the AND #%00100000 ; ship is not currently exploding, so jump down to EE51 BEQ EE51 ; to skip drawing the ship LDA XX1+31 ; The ship is exploding, so clear bit 3 of the ship's AND #%11110111 ; byte #31 to denote that the ship is no longer being STA XX1+31 ; drawn on-screen JMP DOEXP ; Jump to DOEXP to remove the explosion burst sprites ; from the screen (if they are visible), returning from ; the subroutine using a tail call .EE51 LDA XX1+31 ; Clear bits 3 and 6 in the ship's byte #31, which stops AND #%10110111 ; drawing the ship on-screen (bit 3), and denotes that STA XX1+31 ; the explosion has not been drawn and there are no ; lasers firing (bit 6) RTS ; Return from the subroutine
Name: LL9 (Part 2 of 12) [Show more] Type: Subroutine Category: Drawing ships Summary: Draw ship: Check if ship is in field of view, close enough to draw Deep dive: Drawing ships
Context: See this subroutine on its own page References: No direct references to this subroutine in this source file

This part checks whether the ship is in our field of view, and whether it is close enough to be fully drawn (if not, we jump to SHPPT to draw it as a dot).
Other entry points: LL10-1 Contains an RTS
.LL10 LDA XX1+7 ; Set A = z_hi CMP #192 ; If A >= 192 then the ship is a long way away, so jump BCS LL14 ; to LL14 to remove the ship from the screen LDA XX1 ; If x_lo >= z_lo, set the C flag, otherwise clear it CMP XX1+6 LDA XX1+1 ; Set A = x_hi - z_hi using the carry from the low SBC XX1+7 ; bytes, which sets the C flag as if we had done a full ; two-byte subtraction (x_hi x_lo) - (z_hi z_lo) BCS LL14 ; If the C flag is set then x >= z, so the ship is ; further to the side than it is in front of us, so it's ; outside our viewing angle of 45 degrees, and we jump ; to LL14 to remove it from the screen LDA XX1+3 ; If y_lo >= z_lo, set the C flag, otherwise clear it CMP XX1+6 LDA XX1+4 ; Set A = y_hi - z_hi using the carry from the low SBC XX1+7 ; bytes, which sets the C flag as if we had done a full ; two-byte subtraction (y_hi y_lo) - (z_hi z_lo) BCS LL14 ; If the C flag is set then y >= z, so the ship is ; further above us than it is in front of us, so it's ; outside our viewing angle of 45 degrees, and we jump ; to LL14 to remove it from the screen LDY #6 ; Fetch byte #6 from the ship's blueprint into X, which LDA (XX0),Y ; is the number * 4 of the vertex used for the ship's TAX ; laser LDA #255 ; Set bytes X and X+1 of the XX3 heap to 255. We're STA XX3,X ; going to use XX3 to store the screen coordinates of STA XX3+1,X ; all the visible vertices of this ship, so setting the ; laser vertex to 255 means that if we don't update this ; vertex with its screen coordinates in parts 6 and 7, ; this vertex's entry in the XX3 heap will still be 255, ; which we can check in part 9 to see if the laser ; vertex is visible (and therefore whether we should ; draw laser lines if the ship is firing on us) LDA XX1+6 ; Set (A T) = (z_hi z_lo) STA T LDA XX1+7 LSR A ; Set (A T) = (A T) / 8 ROR T LSR A ROR T LSR A ROR T LSR A ; If A >> 4 is non-zero, i.e. z_hi >= 16, jump to LL13 BNE LL13 ; as the ship is possibly far away enough to be shown as ; a dot LDA T ; Otherwise the C flag contains the previous bit 0 of A, ROR A ; which could have been set, so rotate A right four LSR A ; times so it's in the form %000xxxxx, i.e. z_hi reduced LSR A ; to a maximum value of 31 LSR A STA XX4 ; Store A in XX4, which is now the distance of the ship ; we can use for visibility testing BPL LL17 ; Jump down to LL17 (this BPL is effectively a JMP as we ; know bit 7 of A is definitely clear) .LL13 ; If we get here then the ship is possibly far enough ; away to be shown as a dot LDY #13 ; Fetch byte #13 from the ship's blueprint, which gives LDA (XX0),Y ; the ship's visibility distance, beyond which we show ; the ship as a dot CMP XX1+7 ; If z_hi <= the visibility distance, skip to LL17 to BCS LL17 ; draw the ship fully, rather than as a dot, as it is ; closer than the visibility distance LDA #%00100000 ; If bit 5 of the ship's byte #31 is set, then the AND XX1+31 ; ship is currently exploding, so skip to LL17 to draw BNE LL17 ; the ship's explosion cloud JMP SHPPT ; Otherwise jump to SHPPT to draw the ship as a dot, ; returning from the subroutine using a tail call
Name: LL9 (Part 3 of 12) [Show more] Type: Subroutine Category: Drawing ships Summary: Draw ship: Set up orientation vector, ship coordinate variables Deep dive: Drawing ships
Context: See this subroutine on its own page References: No direct references to this subroutine in this source file

This part sets up the following variable blocks: * XX16 contains the orientation vectors, divided to normalise them * XX18 contains the ship's x, y and z coordinates in space
.LL17 LDX #5 ; First we copy the three orientation vectors into XX16, ; so set up a counter in X for the 6 bytes in each ; vector .LL15 LDA XX1+21,X ; Copy the X-th byte of sidev to the X-th byte of XX16 STA XX16,X LDA XX1+15,X ; Copy the X-th byte of roofv to XX16+6 to the X-th byte STA XX16+6,X ; of XX16+6 LDA XX1+9,X ; Copy the X-th byte of nosev to XX16+12 to the X-th STA XX16+12,X ; byte of XX16+12 DEX ; Decrement the counter BPL LL15 ; Loop back to copy the next byte of each vector, until ; we have the following: ; ; * XX16(1 0) = sidev_x ; * XX16(3 2) = sidev_y ; * XX16(5 4) = sidev_z ; ; * XX16(7 6) = roofv_x ; * XX16(9 8) = roofv_y ; * XX16(11 10) = roofv_z ; ; * XX16(13 12) = nosev_x ; * XX16(15 14) = nosev_y ; * XX16(17 16) = nosev_z LDA #197 ; Set Q = 197 STA Q LDY #16 ; Set Y to be a counter that counts down by 2 each time, ; starting with 16, then 14, 12 and so on. We use this ; to work through each of the coordinates in each of the ; orientation vectors .LL21 SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 LDA XX16,Y ; Set A = the low byte of the vector coordinate, e.g. ; nosev_z_lo when Y = 16 ASL A ; Shift bit 7 into the C flag LDA XX16+1,Y ; Set A = the high byte of the vector coordinate, e.g. ; nosev_z_hi when Y = 16 ROL A ; Rotate A left, incorporating the C flag, so A now ; contains the original high byte, doubled, and without ; a sign bit, e.g. A = |nosev_z_hi| * 2 JSR LL28 ; Call LL28 to calculate: ; ; R = 256 * A / Q ; ; so, for nosev, this would be: ; ; R = 256 * |nosev_z_hi| * 2 / 197 ; = 2.6 * |nosev_z_hi| LDX R ; Store R in the low byte's location, so we can keep the STX XX16,Y ; old, unscaled high byte intact for the sign DEY ; Decrement the loop counter twice DEY BPL LL21 ; Loop back for the next vector coordinate until we have ; divided them all ; By this point, the vectors have been turned into ; scaled magnitudes, so we have the following: ; ; * XX16 = scaled |sidev_x| ; * XX16+2 = scaled |sidev_y| ; * XX16+4 = scaled |sidev_z| ; ; * XX16+6 = scaled |roofv_x| ; * XX16+8 = scaled |roofv_y| ; * XX16+10 = scaled |roofv_z| ; ; * XX16+12 = scaled |nosev_x| ; * XX16+14 = scaled |nosev_y| ; * XX16+16 = scaled |nosev_z| LDX #8 ; Next we copy the ship's coordinates into XX18, so set ; up a counter in X for 9 bytes .ll91 LDA XX1,X ; Copy the X-th byte from XX1 to XX18 STA XX18,X DEX ; Decrement the loop counter BPL ll91 ; Loop back for the next byte until we have copied all ; three coordinates ; So we now have the following: ; ; * XX18(2 1 0) = (x_sign x_hi x_lo) ; ; * XX18(5 4 3) = (y_sign y_hi y_lo) ; ; * XX18(8 7 6) = (z_sign z_hi z_lo) LDA #255 ; Set the 15th byte of XX2 to 255, so that face 15 is STA XX2+15 ; always visible. No ship definitions actually have this ; number of faces, but this allows us to force a vertex ; to always be visible by associating it with face 15 ; (see the ship blueprints for the Cobra Mk III at ; SHIP_COBRA_MK_3 and the asteroid at SHIP_ASTEROID for ; examples of vertices that are associated with face 15) LDY #12 ; Set Y = 12 to point to the ship blueprint byte #12, LDA XX1+31 ; If bit 5 of the ship's byte #31 is clear, then the AND #%00100000 ; ship is not currently exploding, so jump down to EE29 BEQ EE29 ; to skip the following ; Otherwise we fall through to set up the visibility ; block for an exploding ship
Name: LL9 (Part 4 of 12) [Show more] Type: Subroutine Category: Drawing ships Summary: Draw ship: Set visibility for exploding ship (all faces visible) Deep dive: Drawing ships
Context: See this subroutine on its own page References: No direct references to this subroutine in this source file

This part sets up the visibility block in XX2 for a ship that is exploding. The XX2 block consists of one byte for each face in the ship's blueprint, which holds the visibility of that face. Because the ship is exploding, we want to set all the faces to be visible. A value of 255 in the visibility table means the face is visible, so the following code sets each face to 255 and then skips over the face visibility calculations that we would apply to a non-exploding ship.
LDA (XX0),Y ; Fetch byte #12 of the ship's blueprint, which contains ; the number of faces * 4 LSR A ; Set X = A / 4 LSR A ; = the number of faces TAX LDA #255 ; Set A = 255 .EE30 STA XX2,X ; Set the X-th byte of XX2 to 255 DEX ; Decrement the loop counter BPL EE30 ; Loop back for the next byte until there is one byte ; set to 255 for each face INX ; Set XX4 = 0 for the distance value we use to test STX XX4 ; for visibility, so we always shows everything .LL41 JMP LL42 ; Jump to LL42 to skip the face visibility calculations ; as we don't need to do them now we've set up the XX2 ; block for the explosion
Name: LL9 (Part 5 of 12) [Show more] Type: Subroutine Category: Drawing ships Summary: Draw ship: Calculate the visibility of each of the ship's faces Deep dive: Drawing ships Back-face culling
Context: See this subroutine on its own page References: No direct references to this subroutine in this source file
.EE29 LDA (XX0),Y ; We set Y to 12 above before jumping down to EE29, so ; this fetches byte #12 of the ship's blueprint, which ; contains the number of faces * 4 BEQ LL41 ; If there are no faces in this ship, jump to LL42 (via ; LL41) to skip the face visibility calculations STA XX20 ; Set A = the number of faces * 4 LDY #18 ; Fetch byte #18 of the ship's blueprint, which contains LDA (XX0),Y ; the factor by which we scale the face normals, into X TAX LDA XX18+7 ; Set A = z_hi .LL90 TAY ; Set Y = z_hi BEQ LL91 ; If z_hi = 0 then jump to LL91 ; The following is a loop that jumps back to LL90+3, ; i.e. here. LL90 is only used for this loop, so it's a ; bit of a strange use of the label here INX ; Increment the scale factor in X LSR XX18+4 ; Divide (y_hi y_lo) by 2 ROR XX18+3 LSR XX18+1 ; Divide (x_hi x_lo) by 2 ROR XX18 LSR A ; Divide (z_hi z_lo) by 2 (as A contains z_hi) ROR XX18+6 TAY ; Set Y = z_hi BNE LL90+3 ; If Y is non-zero, loop back to LL90+3 to divide the ; three coordinates until z_hi is 0 .LL91 ; By this point z_hi is 0 and X contains the number of ; right shifts we had to do, plus the scale factor from ; the blueprint STX XX17 ; Store the updated scale factor in XX17 LDA XX18+8 ; Set XX15+5 = z_sign STA XX15+5 LDA XX18 ; Set XX15(1 0) = (x_sign x_lo) STA XX15 LDA XX18+2 STA XX15+1 LDA XX18+3 ; Set XX15(3 2) = (y_sign y_lo) STA XX15+2 LDA XX18+5 STA XX15+3 LDA XX18+6 ; Set XX15+4 = z_lo, so now XX15(5 4) = (z_sign z_lo) STA XX15+4 JSR LL51 ; Call LL51 to set XX12 to the dot products of XX15 and ; XX16, which we'll call dot_sidev, dot_roofv and ; dot_nosev: ; ; XX12(1 0) = [x y z] . sidev ; = (dot_sidev_sign dot_sidev_lo) ; = dot_sidev ; ; XX12(3 2) = [x y z] . roofv ; = (dot_roofv_sign dot_roofv_lo) ; = dot_roofv ; ; XX12(5 4) = [x y z] . nosev ; = (dot_nosev_sign dot_nosev_lo) ; = dot_nosev LDA XX12 ; Set XX18(2 0) = dot_sidev STA XX18 LDA XX12+1 STA XX18+2 LDA XX12+2 ; Set XX18(5 3) = dot_roofv STA XX18+3 LDA XX12+3 STA XX18+5 LDA XX12+4 ; Set XX18(8 6) = dot_nosev STA XX18+6 LDA XX12+5 STA XX18+8 LDY #4 ; Fetch byte #4 of the ship's blueprint, which contains LDA (XX0),Y ; the low byte of the offset to the faces data CLC ; Set V = low byte faces offset + XX0 ADC XX0 STA V LDY #17 ; Fetch byte #17 of the ship's blueprint, which contains LDA (XX0),Y ; the high byte of the offset to the faces data ADC XX0+1 ; Set V+1 = high byte faces offset + XX0+1 STA V+1 ; ; So V(1 0) now points to the start of the faces data ; for this ship LDY #0 ; We're now going to loop through all the faces for this ; ship, so set a counter in Y, starting from 0, which we ; will increment by 4 each loop to step through the ; four bytes of data for each face .LL86 SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 LDA (V),Y ; Fetch byte #0 for this face into A, so: ; ; A = %xyz vvvvv, where: ; ; * Bits 0-4 = visibility distance, beyond which the ; face is always shown ; ; * Bits 7-5 = the sign bits of normal_x, normal_y ; and normal_z STA XX12+1 ; Store byte #0 in XX12+1, so XX12+1 now has the sign of ; normal_x AND #%00011111 ; Extract bits 0-4 to give the visibility distance CMP XX4 ; If XX4 <= the visibility distance, where XX4 contains BCS LL87 ; the ship's z-distance reduced to 0-31 (which we set in ; part 2), skip to LL87 as this face is close enough ; that we have to test its visibility using the face ; normals ; Otherwise this face is within range and is therefore ; always shown TYA ; Set X = Y / 4 LSR A ; = the number of this face * 4 /4 LSR A ; = the number of this face TAX LDA #255 ; Set the X-th byte of XX2 to 255 to denote that this STA XX2,X ; face is visible TYA ; Set Y = Y + 4 to point to the next face ADC #4 TAY JMP LL88 ; Jump down to LL88 to skip the following, as we don't ; need to test the face normals .LL87 LDA XX12+1 ; Fetch byte #0 for this face into A ASL A ; Shift A left and store it, so XX12+3 now has the sign STA XX12+3 ; of normal_y ASL A ; Shift A left and store it, so XX12+5 now has the sign STA XX12+5 ; of normal_z INY ; Increment Y to point to byte #1 LDA (V),Y ; Fetch byte #1 for this face and store in XX12, so STA XX12 ; XX12 = normal_x INY ; Increment Y to point to byte #2 LDA (V),Y ; Fetch byte #2 for this face and store in XX12+2, so STA XX12+2 ; XX12+2 = normal_y INY ; Increment Y to point to byte #3 LDA (V),Y ; Fetch byte #3 for this face and store in XX12+4, so STA XX12+4 ; XX12+4 = normal_z ; So we now have: ; ; XX12(1 0) = (normal_x_sign normal_x) ; ; XX12(3 2) = (normal_y_sign normal_y) ; ; XX12(5 4) = (normal_z_sign normal_z) LDX XX17 ; If XX17 < 4 then jump to LL92, otherwise we stored a CPX #4 ; larger scale factor above BCC LL92 .LL143 LDA XX18 ; Set XX15(1 0) = XX18(2 0) STA XX15 ; = dot_sidev LDA XX18+2 STA XX15+1 LDA XX18+3 ; Set XX15(3 2) = XX18(5 3) STA XX15+2 ; = dot_roofv LDA XX18+5 STA XX15+3 LDA XX18+6 ; Set XX15(5 4) = XX18(8 6) STA XX15+4 ; = dot_nosev LDA XX18+8 STA XX15+5 JMP LL89 ; Jump down to LL89 .ovflw ; If we get here then the addition below overflowed, so ; we halve the dot products and normal vector SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 LSR XX18 ; Divide dot_sidev_lo by 2, so dot_sidev = dot_sidev / 2 LSR XX18+6 ; Divide dot_nosev_lo by 2, so dot_nosev = dot_nosev / 2 LSR XX18+3 ; Divide dot_roofv_lo by 2, so dot_roofv = dot_roofv / 2 LDX #1 ; Set X = 1 so when we fall through into LL92, we divide ; the normal vector by 2 as well .LL92 ; We jump here from above with the scale factor in X, ; and now we apply it by scaling the normal vector down ; by a factor of 2^X (i.e. divide by 2^X) LDA XX12 ; Set XX15 = normal_x STA XX15 LDA XX12+2 ; Set XX15+2 = normal_y STA XX15+2 LDA XX12+4 ; Set A = normal_z .LL93 DEX ; Decrement the scale factor in X BMI LL94 ; If X was 0 before the decrement, there is no scaling ; to do, so jump to LL94 to exit the loop LSR XX15 ; Set XX15 = XX15 / 2 ; = normal_x / 2 LSR XX15+2 ; Set XX15+2 = XX15+2 / 2 ; = normal_y / 2 LSR A ; Set A = A / 2 ; = normal_z / 2 DEX ; Decrement the scale factor in X BPL LL93+3 ; If we have more scaling to do, loop back up to the ; first LSR above until the normal vector is scaled down .LL94 STA R ; Set R = normal_z LDA XX12+5 ; Set S = normal_z_sign STA S LDA XX18+6 ; Set Q = dot_nosev_lo STA Q LDA XX18+8 ; Set A = dot_nosev_sign JSR LL38 ; Set (S A) = (S R) + (A Q) ; = normal_z + dot_nosev ; ; setting the sign of the result in S BCS ovflw ; If the addition overflowed, jump up to ovflw to divide ; both the normal vector and dot products by 2 and try ; again STA XX15+4 ; Set XX15(5 4) = (S A) LDA S ; = normal_z + dot_nosev STA XX15+5 LDA XX15 ; Set R = normal_x STA R LDA XX12+1 ; Set S = normal_x_sign STA S LDA XX18 ; Set Q = dot_sidev_lo STA Q LDA XX18+2 ; Set A = dot_sidev_sign JSR LL38 ; Set (S A) = (S R) + (A Q) ; = normal_x + dot_sidev ; ; setting the sign of the result in S BCS ovflw ; If the addition overflowed, jump up to ovflw to divide ; both the normal vector and dot products by 2 and try ; again STA XX15 ; Set XX15(1 0) = (S A) LDA S ; = normal_x + dot_sidev STA XX15+1 LDA XX15+2 ; Set R = normal_y STA R LDA XX12+3 ; Set S = normal_y_sign STA S LDA XX18+3 ; Set Q = dot_roofv_lo STA Q LDA XX18+5 ; Set A = dot_roofv_sign JSR LL38 ; Set (S A) = (S R) + (A Q) ; = normal_y + dot_roofv BCS ovflw ; If the addition overflowed, jump up to ovflw to divide ; both the normal vector and dot products by 2 and try ; again STA XX15+2 ; Set XX15(3 2) = (S A) LDA S ; = normal_y + dot_roofv STA XX15+3 .LL89 ; When we get here, we have set up the following: ; ; XX15(1 0) = normal_x + dot_sidev ; = normal_x + [x y z] . sidev ; ; XX15(3 2) = normal_y + dot_roofv ; = normal_y + [x y z] . roofv ; ; XX15(5 4) = normal_z + dot_nosev ; = normal_z + [x y z] . nosev ; ; and: ; ; XX12(1 0) = (normal_x_sign normal_x) ; ; XX12(3 2) = (normal_y_sign normal_y) ; ; XX12(5 4) = (normal_z_sign normal_z) ; ; We now calculate the dot product XX12 . XX15 to tell ; us whether or not this face is visible LDA XX12 ; Set Q = XX12 STA Q SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 LDA XX15 ; Set A = XX15 JSR FMLTU ; Set T = A * Q / 256 STA T ; = XX15 * XX12 / 256 LDA XX12+1 ; Set S = sign of XX15(1 0) * XX12(1 0), so: EOR XX15+1 ; STA S ; (S T) = XX15(1 0) * XX12(1 0) / 256 LDA XX12+2 ; Set Q = XX12+2 STA Q LDA XX15+2 ; Set A = XX15+2 JSR FMLTU ; Set Q = A * Q STA Q ; = XX15+2 * XX12+2 / 256 LDA T ; Set T = R, so now: STA R ; ; (S R) = XX15(1 0) * XX12(1 0) / 256 LDA XX12+3 ; Set A = sign of XX15+3 * XX12+3, so: EOR XX15+3 ; ; (A Q) = XX15(3 2) * XX12(3 2) / 256 JSR LL38 ; Set (S T) = (S R) + (A Q) STA T ; = XX15(1 0) * XX12(1 0) / 256 ; + XX15(3 2) * XX12(3 2) / 256 LDA XX12+4 ; Set Q = XX12+4 STA Q LDA XX15+4 ; Set A = XX15+4 JSR FMLTU ; Set Q = A * Q STA Q ; = XX15+4 * XX12+4 / 256 LDA T ; Set T = R, so now: STA R ; ; (S R) = XX15(1 0) * XX12(1 0) / 256 ; + XX15(3 2) * XX12(3 2) / 256 LDA XX15+5 ; Set A = sign of XX15+5 * XX12+5, so: EOR XX12+5 ; ; (A Q) = XX15(5 4) * XX12(5 4) / 256 JSR LL38 ; Set (S A) = (S R) + (A Q) ; = XX15(1 0) * XX12(1 0) / 256 ; + XX15(3 2) * XX12(3 2) / 256 ; + XX15(5 4) * XX12(5 4) / 256 PHA ; Push the result A onto the stack, so the stack now ; contains the dot product XX12 . XX15 TYA ; Set X = Y / 4 LSR A ; = the number of this face * 4 /4 LSR A ; = the number of this face TAX PLA ; Pull the dot product off the stack into A BIT S ; If bit 7 of S is set, i.e. the dot product is BMI P%+4 ; negative, then this face is visible as its normal is ; pointing towards us, so skip the following instruction LDA #0 ; Otherwise the face is not visible, so set A = 0 so we ; can store this to mean "not visible" STA XX2,X ; Store the face's visibility in the X-th byte of XX2 INY ; Above we incremented Y to point to byte #3, so this ; increments Y to point to byte #4, i.e. byte #0 of the ; next face .LL88 CPY XX20 ; If Y >= XX20, the number of faces * 4, jump down to BCS LL42 ; LL42 to move on to the JMP LL86 ; Otherwise loop back to LL86 to work out the visibility ; of the next face
Name: LL9 (Part 6 of 12) [Show more] Type: Subroutine Category: Drawing ships Summary: Draw ship: Calculate the visibility of each of the ship's vertices Deep dive: Drawing ships Calculating vertex coordinates
Context: See this subroutine on its own page References: No direct references to this subroutine in this source file

This section calculates the visibility of each of the ship's vertices, and for those that are visible, it starts the process of calculating the screen coordinates of each vertex
.LL42 ; The first task is to set up the inverse matrix, ready ; for us to send to the dot product routine at LL51. ; Back up in part 3, we set up the following variables: ; ; * XX16(1 0) = sidev_x ; * XX16(3 2) = sidev_y ; * XX16(5 4) = sidev_z ; ; * XX16(7 6) = roofv_x ; * XX16(9 8) = roofv_y ; * XX16(11 10) = roofv_z ; ; * XX16(13 12) = nosev_x ; * XX16(15 14) = nosev_y ; * XX16(17 16) = nosev_z ; ; and we then scaled the vectors to give the following: ; ; * XX16 = scaled |sidev_x| ; * XX16+2 = scaled |sidev_y| ; * XX16+4 = scaled |sidev_z| ; ; * XX16+6 = scaled |roofv_x| ; * XX16+8 = scaled |roofv_y| ; * XX16+10 = scaled |roofv_z| ; ; * XX16+12 = scaled |nosev_x| ; * XX16+14 = scaled |nosev_y| ; * XX16+16 = scaled |nosev_z| ; ; We now need to rearrange these locations so they ; effectively transpose the matrix into its inverse LDY XX16+2 ; Set XX16+2 = XX16+6 = scaled |roofv_x| LDX XX16+3 ; Set XX16+3 = XX16+7 = roofv_x_hi LDA XX16+6 ; Set XX16+6 = XX16+2 = scaled |sidev_y| STA XX16+2 ; Set XX16+7 = XX16+3 = sidev_y_hi LDA XX16+7 STA XX16+3 STY XX16+6 STX XX16+7 LDY XX16+4 ; Set XX16+4 = XX16+12 = scaled |nosev_x| LDX XX16+5 ; Set XX16+5 = XX16+13 = nosev_x_hi LDA XX16+12 ; Set XX16+12 = XX16+4 = scaled |sidev_z| STA XX16+4 ; Set XX16+13 = XX16+5 = sidev_z_hi LDA XX16+13 STA XX16+5 STY XX16+12 STX XX16+13 LDY XX16+10 ; Set XX16+10 = XX16+14 = scaled |nosev_y| LDX XX16+11 ; Set XX16+11 = XX16+15 = nosev_y_hi LDA XX16+14 ; Set XX16+14 = XX16+10 = scaled |roofv_z| STA XX16+10 ; Set XX16+15 = XX16+11 = roofv_z LDA XX16+15 STA XX16+11 STY XX16+14 STX XX16+15 ; So now we have the following sign-magnitude variables ; containing parts of the scaled orientation vectors: ; ; XX16(1 0) = scaled sidev_x ; XX16(3 2) = scaled roofv_x ; XX16(5 4) = scaled nosev_x ; ; XX16(7 6) = scaled sidev_y ; XX16(9 8) = scaled roofv_y ; XX16(11 10) = scaled nosev_y ; ; XX16(13 12) = scaled sidev_z ; XX16(15 14) = scaled roofv_z ; XX16(17 16) = scaled nosev_z ; ; which is what we want, as the various vectors are now ; arranged so we can use LL51 to multiply by the ; transpose (i.e. the inverse of the matrix) LDY #8 ; Fetch byte #8 of the ship's blueprint, which is the LDA (XX0),Y ; number of vertices * 8, and store it in XX20 STA XX20 ; We now set V(1 0) = XX0(1 0) + 20, so V(1 0) points ; to byte #20 of the ship's blueprint, which is always ; where the vertex data starts (i.e. just after the 20 ; byte block that define the ship's characteristics) LDA XX0 ; We start with the low bytes CLC ADC #20 STA V LDA XX0+1 ; And then do the high bytes ADC #0 STA V+1 LDY #0 ; We are about to step through all the vertices, using ; Y as a counter. There are six data bytes for each ; vertex, so we will increment Y by 6 for each iteration ; so it can act as an offset from V(1 0) to the current ; vertex's data STY CNT ; Set CNT = 0, which we will use as a pointer to the ; heap at XX3, starting it at zero so the heap starts ; out empty .LL48 SETUP_PPU_FOR_ICON_BAR ; If the PPU has started drawing the icon bar, configure ; the PPU to use nametable 0 and pattern table 0 STY XX17 ; Set XX17 = Y, so XX17 now contains the offset of the ; current vertex's data LDA (V),Y ; Fetch byte #0 for this vertex into XX15, so: STA XX15 ; ; XX15 = magnitude of the vertex's x-coordinate INY ; Increment Y to point to byte #1 LDA (V),Y ; Fetch byte #1 for this vertex into XX15+2, so: STA XX15+2 ; ; XX15+2 = magnitude of the vertex's y-coordinate INY ; Increment Y to point to byte #2 LDA (V),Y ; Fetch byte #2 for this vertex into XX15+4, so: STA XX15+4 ; ; XX15+4 = magnitude of the vertex's z-coordinate INY ; Increment Y to point to byte #3 LDA (V),Y ; Fetch byte #3 for this vertex into T, so: STA T ; ; T = %xyz vvvvv, where: ; ; * Bits 0-4 = visibility distance, beyond which the ; vertex is not shown ; ; * Bits 7-5 = the sign bits of x, y and z AND #%00011111 ; Extract bits 0-4 to get the visibility distance CMP XX4 ; If XX4 > the visibility distance, where XX4 contains BCC LL49-3 ; the ship's z-distance reduced to 0-31 (which we set in ; part 2), then this vertex is too far away to be ; visible, so jump down to LL50 (via the JMP instruction ; in LL49-3) to move on to the next vertex INY ; Increment Y to point to byte #4 LDA (V),Y ; Fetch byte #4 for this vertex into P, so: STA P ; ; P = %ffff ffff, where: ; ; * Bits 0-3 = the number of face 1 ; ; * Bits 4-7 = the number of face 2 AND #%00001111 ; Extract the number of face 1 into X TAX LDA XX2,X ; If XX2+X is non-zero then we decided in part 5 that BNE LL49 ; face 1 is visible, so jump to LL49 LDA P ; Fetch byte #4 for this vertex into A LSR A ; Shift right four times to extract the number of face 2 LSR A ; from bits 4-7 into X LSR A LSR A TAX LDA XX2,X ; If XX2+X is non-zero then we decided in part 5 that BNE LL49 ; face 2 is visible, so jump to LL49 INY ; Increment Y to point to byte #5 LDA (V),Y ; Fetch byte #5 for this vertex into P, so: STA P ; ; P = %ffff ffff, where: ; ; * Bits 0-3 = the number of face 3 ; ; * Bits 4-7 = the number of face 4 AND #%00001111 ; Extract the number of face 1 into X TAX LDA XX2,X ; If XX2+X is non-zero then we decided in part 5 that BNE LL49 ; face 3 is visible, so jump to LL49 LDA P ; Fetch byte #5 for this vertex into A LSR A ; Shift right four times to extract the number of face 4 LSR A ; from bits 4-7 into X LSR A LSR A TAX LDA XX2,X ; If XX2+X is non-zero then we decided in part 5 that BNE LL49 ; face 4 is visible, so jump to LL49 JMP LL50 ; If we get here then none of the four faces associated ; with this vertex are visible, so this vertex is also ; not visible, so jump to LL50 to move on to the next ; vertex .LL49 LDA T ; Fetch byte #5 for this vertex into A and store it, so STA XX15+1 ; XX15+1 now has the sign of the vertex's x-coordinate ASL A ; Shift A left and store it, so XX15+3 now has the sign STA XX15+3 ; of the vertex's y-coordinate ASL A ; Shift A left and store it, so XX15+5 now has the sign STA XX15+5 ; of the vertex's z-coordinate ; By this point we have the following: ; ; XX15(1 0) = vertex x-coordinate ; XX15(3 2) = vertex y-coordinate ; XX15(5 4) = vertex z-coordinate ; ; XX16(1 0) = scaled sidev_x ; XX16(3 2) = scaled roofv_x ; XX16(5 4) = scaled nosev_x ; ; XX16(7 6) = scaled sidev_y ; XX16(9 8) = scaled roofv_y ; XX16(11 10) = scaled nosev_y ; ; XX16(13 12) = scaled sidev_z ; XX16(15 14) = scaled roofv_z ; XX16(17 16) = scaled nosev_z JSR LL51 ; Call LL51 to set XX12 to the dot products of XX15 and ; XX16, as follows: ; ; XX12(1 0) = [ x y z ] . [ sidev_x roofv_x nosev_x ] ; ; XX12(3 2) = [ x y z ] . [ sidev_y roofv_y nosev_y ] ; ; XX12(5 4) = [ x y z ] . [ sidev_z roofv_z nosev_z ] ; ; XX12 contains the vector from the ship's centre to ; the vertex, transformed from the orientation vector ; space to the universe orientated around our ship. So ; we can refer to this vector below, let's call it ; vertv, so: ; ; vertv_x = [ x y z ] . [ sidev_x roofv_x nosev_x ] ; ; vertv_y = [ x y z ] . [ sidev_y roofv_y nosev_y ] ; ; vertv_z = [ x y z ] . [ sidev_z roofv_z nosev_z ] ; ; To finish the calculation, we now want to calculate: ; ; vertv + [ x y z ] ; ; So let's start with the vertv_x + x LDA XX1+2 ; Set A = x_sign of the ship's location STA XX15+2 ; Set XX15+2 = x_sign EOR XX12+1 ; If the sign of x_sign * the sign of vertv_x is BMI LL52 ; negative (i.e. they have different signs), skip to ; LL52 CLC ; Set XX15(2 1 0) = XX1(2 1 0) + XX12(1 0) LDA XX12 ; = (x_sign x_hi x_lo) + vertv_x ADC XX1 ; STA XX15 ; Starting with the low bytes LDA XX1+1 ; And then doing the high bytes (we can add 0 here as ADC #0 ; we know the sign byte of vertv_x is 0) STA XX15+1 JMP LL53 ; We've added the x-coordinates, so jump to LL53 to do ; the y-coordinates .LL52 ; If we get here then x_sign and vertv_x have different ; signs, so we need to subtract them to get the result LDA XX1 ; Set XX15(2 1 0) = XX1(2 1 0) - XX12(1 0) SEC ; = (x_sign x_hi x_lo) - vertv_x SBC XX12 ; STA XX15 ; Starting with the low bytes LDA XX1+1 ; And then doing the high bytes (we can subtract 0 here SBC #0 ; as we know the sign byte of vertv_x is 0) STA XX15+1 BCS LL53 ; If the subtraction didn't underflow, then the sign of ; the result is the same sign as x_sign, and that's what ; we want, so we can jump down to LL53 to do the ; y-coordinates EOR #%11111111 ; Otherwise we need to negate the result using two's STA XX15+1 ; complement, so first we flip the bits of the high byte LDA #1 ; And then subtract the low byte from 1 SBC XX15 STA XX15 BCC P%+4 ; If the above subtraction underflowed then we need to INC XX15+1 ; bump the high byte of the result up by 1 LDA XX15+2 ; And now we flip the sign of the result to get the EOR #%10000000 ; correct result STA XX15+2 .LL53 ; Now for the y-coordinates, vertv_y + y LDA XX1+5 ; Set A = y_sign of the ship's location STA XX15+5 ; Set XX15+5 = y_sign EOR XX12+3 ; If the sign of y_sign * the sign of vertv_y is BMI LL54 ; negative (i.e. they have different signs), skip to ; LL54 CLC ; Set XX15(5 4 3) = XX1(5 4 3) + XX12(3 2) LDA XX12+2 ; = (y_sign y_hi y_lo) + vertv_y ADC XX1+3 ; STA XX15+3 ; Starting with the low bytes LDA XX1+4 ; And then doing the high bytes (we can add 0 here as ADC #0 ; we know the sign byte of vertv_y is 0) STA XX15+4 JMP LL55 ; We've added the y-coordinates, so jump to LL55 to do ; the z-coordinates .LL54 ; If we get here then y_sign and vertv_y have different ; signs, so we need to subtract them to get the result LDA XX1+3 ; Set XX15(5 4 3) = XX1(5 4 3) - XX12(3 2) SEC ; = (y_sign y_hi y_lo) - vertv_y SBC XX12+2 ; STA XX15+3 ; Starting with the low bytes LDA XX1+4 ; And then doing the high bytes (we can subtract 0 here SBC #0 ; as we know the sign byte of vertv_z is 0) STA XX15+4 BCS LL55 ; If the subtraction didn't underflow, then the sign of ; the result is the same sign as y_sign, and that's what ; we want, so we can jump down to LL55 to do the ; z-coordinates EOR #%11111111 ; Otherwise we need to negate the result using two's STA XX15+4 ; complement, so first we flip the bits of the high byte LDA XX15+3 ; And then flip the bits of the low byte and add 1 EOR #%11111111 ADC #1 STA XX15+3 LDA XX15+5 ; And now we flip the sign of the result to get the EOR #%10000000 ; correct result STA XX15+5 BCC LL55 ; If the above subtraction underflowed then we need to INC XX15+4 ; bump the high byte of the result up by 1 .LL55 ; Now for the z-coordinates, vertv_z + z LDA XX12+5 ; If vertv_z_hi is negative, jump down to LL56 BMI LL56 LDA XX12+4 ; Set (U T) = XX1(7 6) + XX12(5 4) CLC ; = (z_hi z_lo) + vertv_z ADC XX1+6 ; STA T ; Starting with the low bytes LDA XX1+7 ; And then doing the high bytes (we can add 0 here as ADC #0 ; we know the sign byte of vertv_y is 0) STA U JMP LL57 ; We've added the z-coordinates, so jump to LL57 ; The adding process is continued in part 7, after a ; couple of subroutines that we don't need quite yet