.clan10 \ When we jump here from part 3, we know that: \ \ * We are not on the ground \ \ * yLandingGear >= yPlaneLo \ \ * A = yLandingGear \ \ The second condition means that the plane is closer to \ the ground than the distance between the plane and the \ lowest part of the plane, so we have touched down and \ the bottom part of the plane is now below ground level \ (which we now need to fix) SEC \ Set A = (yLandingGear - yPlaneLo) / 2 SBC yPlaneLo \ LSR A \ so A contains half the distance that the wheels would \ be below the ground if we didn't fix this CLC \ Set yPlaneLo = yLandingGear + A ADC yLandingGear \ STA yPlaneLo \ so the plane bounces up by the distance in A, which is \ greater, the further "below" the ground the wheels are LDA yVelocityTop \ If the top byte of the plane's vertical velocity is BPL clan11 \ positive, skip the following as the plane is already \ travelling upwards SEC \ Negate the plane's vertical velocity, so the plane LDA #0 \ bounces up by the same speed as it was originally SBC yVelocityHi \ heading towards the ground STA yVelocityHi LDA #0 SBC yVelocityTop .clan11 STA yVelocityTop \ Update the top byte of the plane's vertical velocity \ (this instruction should really be before the clan11 \ label, as it has no effect if we jump straight here) \ We now do various velocity checks to make sure we are \ not coming down to fast (if we are, we crash) LSR A \ Shift bit 0 of the top byte of the plane's vertical \ velocity into the C flag BNE clan13 \ If the above shift left any set bits in A, then the \ top byte of the plane's vertical velocity is >= 2, \ so yVelocity >= 512, so jump to clan13 to crash the \ plane, as the we are coming down far too fast to land LDA yVelocityHi \ Set A = (yVelocityTop yVelocityHi) / 2 ROR A \ = yVelocity / 2 \ \ by shifting the low byte right by one place and \ shifting the C flag into the top bit STA R \ Set R = A \ = yVelocity / 2 LDX ucStatus \ If ucStatus is non-zero, then the undercarriage BNE clan12 \ is down, so jump to clan12 \ If we get here then we are descending slowly enough \ to make the landing, but the undercarriage is up, so \ the propellor will smash into the ground DEX \ Set propellorStatus = 255 to denote that the propellor STX propellorStatus \ is broken, so we can't turn the engine on again CMP #160 \ If A < 160, i.e. yVelocity < 320, jump to clan14 to BCC clan14 \ turn the engine off before continuing the landing \ checks .clan12 CMP #110 \ If A < 110, i.e. yVelocity < 220, jump to clan15 to BCC clan15 \ continue the landing checks .clan13 \ If we get here then at least one of the following is \ true: \ \ * yVelocity >= 512 \ \ * The undercarriage is up and yVelocity >= 320 \ \ * The undercarriage is down and yVelocity >= 220 \ \ * The undercarriage is down, we are not landing on \ the runway, and yVelocity >= 160 \ \ In all these cases we are coming down too fast for the \ relevant conditions, so the landing has failed \ \ The above means that if the undercarriage is up, we \ can successfully land at higher vertical speeds then \ when the undercarriage is down, though in this case \ both the propellor and engine get destroyed JMP Crash \ Crash the plane and return from the subroutine using a \ tail call .clan14 LDA #0 \ If we get here then the undercarriage is up and we are JSR SetEngine \ making a high-speed landing, so turn off the engine .clan15 \ If we get here then we are descending slowly enough \ to make the landing JSR CheckPlaneOnRunway \ Check whether the plane is over the runway BCC clan16 \ If the plane is on the runway, then jump to clan16 LDA R \ We are not landing on the runway, so set the vertical STA yVelocityHi \ velocity to R, which halves the vertical velocity LDX ucStatus \ If ucStatus is zero, then the undercarriage is up, so BEQ clan16 \ skip the following \ If we get here then the undercarriage is down CMP #80 \ If A < 80, i.e. yVelocity < 160, jump to clan17 to BCC clan17 \ continue the landing checks without making the sound \ of a touchdown BCS clan13 \ Jump to clan13 to crash the plane, as we are \ descending too fast for an emergency landing with the \ undercarriage down .clan16 \ If we get here then either we are landing on the \ runway, or we are making an emergency landing with \ the undercarriage up - in either case, we make a sound \ (though we don't make a sound if this is an emergency \ landing with the undercarriage down) LDA #26 \ Make sound #26, the sound of us making contact with JSR MakeSound \ the ground while landing JSR ResetEngineSound \ Reset the pitch of the engine soundName: ProcessLanding (Part 6 of 7) [Show more] Type: Subroutine Category: Flight model Summary: If we are not taxiing, process the landing Deep dive: Take-offs and landingsContext: See this subroutine in context in the source code References: No direct references to this subroutine in this source file
This part processes the touchdown part of the landing, bouncing the plane and crashing if we are coming down too fast.
[X]
Subroutine CheckPlaneOnRunway (category: Flight model)
Check whether the plane is over the runway
[X]
Subroutine Crash (category: Flight model)
Make a crashing sound, flash the canopy and start a new game
[X]
Subroutine MakeSound (category: Sound)
Make a sound
[X]
Subroutine ResetEngineSound (category: Sound)
Reset the pitch of the engine sound
[X]
Subroutine SetEngine (category: Flight model)
Set the engine status
[X]
Label clan11 is local to this routine
[X]
Label clan12 is local to this routine
[X]
Label clan13 is local to this routine
[X]
Label clan14 is local to this routine
[X]
Label clan15 is local to this routine
[X]
Label clan16 is local to this routine
[X]
Label clan17 in subroutine ProcessLanding (Part 7 of 7)
[X]
Variable propellorStatus in workspace Main variable workspace
Propellor status
[X]
Variable ucStatus in workspace Main variable workspace
Undercarriage status
[X]
Variable yLandingGear in workspace Main variable workspace
The vertical distance between the cockpit and the lowest part of the plane
[X]
Variable yPlaneLo in workspace Main variable workspace
Plane altitude/y-coordinate (low byte)
[X]
Variable yVelocityHi in workspace Main variable workspace
Plane velocity in the y-axis from the perspective of the outside world (high byte)
[X]
Variable yVelocityTop in workspace Main variable workspace
Plane velocity in the y-axis from the perspective of the outside world (top byte)