;;; $C51E: Grapple beam function - fire / go to cancel ;;;
{
; Act as if fire was just pressed. This is often used to *cancel* the beam during no-fire conditions
$9B:C51E AD 1C 0A LDA $0A1C [$7E:0A1C] ;\
$9B:C521 C9 F0 00 CMP #$00F0 ;|
$9B:C524 F0 25 BEQ $25 [$C54B] ;} If [Samus pose] = grabbed by Draygon - moving: go to BRANCH_DRAYGON
$9B:C526 C9 BE 00 CMP #$00BE ;|
$9B:C529 F0 20 BEQ $20 [$C54B] ;/
$9B:C52B 0A ASL A ;\
$9B:C52C 0A ASL A ;|
$9B:C52D 0A ASL A ;|
$9B:C52E AA TAX ;} $16 = (Y offset of Samus projectile origin)
$9B:C52F BF 2D B6 91 LDA $91B62D,x[$91:B975];|
$9B:C533 29 FF 00 AND #$00FF ;|
$9B:C536 85 16 STA $16 [$7E:0016] ;/
$9B:C538 BF 2C B6 91 LDA $91B62C,x[$91:B974];\
$9B:C53C 29 FF 00 AND #$00FF ;} A = (direction shots are fired)
$9B:C53F 89 F0 00 BIT #$00F0 ;\
$9B:C542 F0 0C BEQ $0C [$C550] ;} If (direction shots are fired) & F0h = 0: go to BRANCH_FIRE
$9B:C544 A9 56 C8 LDA #$C856 ;\
$9B:C547 8D 32 0D STA $0D32 [$7E:0D32] ;} Grapple beam function = cancel
$9B:C54A 60 RTS ; Return
; BRANCH_DRAYGON
$9B:C54B 20 B2 C6 JSR $C6B2 [$9B:C6B2] ; A = direction grapple is fired when held by Draygon
$9B:C54E 90 F4 BCC $F4 [$C544] ; Branch cannot be taken
; BRANCH_FIRE
$9B:C550 8D 34 0D STA $0D34 [$7E:0D34] ; Direction grapple is fired = [A]
$9B:C553 0A ASL A ;\
$9B:C554 AA TAX ;} X = [direction grapple is fired] * 2
$9B:C555 BD DB C0 LDA $C0DB,x[$9B:C0DD] ;\
$9B:C558 8D 22 0D STA $0D22 [$7E:0D22] ;} Grapple beam extension X velocity = [$C0DB + [X]] / 100h
$9B:C55B BD EF C0 LDA $C0EF,x[$9B:C0F1] ;\
$9B:C55E 8D 24 0D STA $0D24 [$7E:0D24] ;} Grapple beam extension Y velocity = [$C0EF + [X]] / 100h
$9B:C561 BD 04 C1 LDA $C104,x[$9B:C106] ;\
$9B:C564 8D FA 0C STA $0CFA [$7E:0CFA] ;} Grapple beam end angle = [$C104 + [X]]
$9B:C567 8D FC 0C STA $0CFC [$7E:0CFC] ;/
$9B:C56A A9 0A 00 LDA #$000A ;\
$9B:C56D 8D F6 0C STA $0CF6 [$7E:0CF6] ;} Grapple pose change auto-fire timer = Ah
$9B:C570 AD 1C 0A LDA $0A1C [$7E:0A1C] ;\
$9B:C573 C9 49 00 CMP #$0049 ;|
$9B:C576 F0 10 BEQ $10 [$C588] ;} If [Samus pose] != moonwalk:
$9B:C578 C9 4A 00 CMP #$004A ;|
$9B:C57B F0 0B BEQ $0B [$C588] ;/
$9B:C57D AD 1F 0A LDA $0A1F [$7E:0A1F] ;\
$9B:C580 29 FF 00 AND #$00FF ;|
$9B:C583 C9 01 00 CMP #$0001 ;} If [Samus movement type] = running: go to BRANCH_RUNNING
$9B:C586 F0 40 BEQ $40 [$C5C8] ;/
; Samus is moonwalking or not running
$9B:C588 BD 22 C1 LDA $C122,x[$9B:C124] ;\
$9B:C58B 8D 02 0D STA $0D02 [$7E:0D02] ;} Grapple beam origin X offset = [$C122 + [X]]
$9B:C58E BD 36 C1 LDA $C136,x[$9B:C138] ;\
$9B:C591 38 SEC ;|
$9B:C592 E5 16 SBC $16 [$7E:0016] ;} Grapple beam origin Y offset = [$C136 + [X]] - (Y offset of Samus projectile origin)
$9B:C594 8D 04 0D STA $0D04 [$7E:0D04] ;/
$9B:C597 AD F6 0A LDA $0AF6 [$7E:0AF6] ;\
$9B:C59A 48 PHA ;|
$9B:C59B 18 CLC ;} Grapple beam end X position = [Samus X position] + [grapple beam origin X offset]
$9B:C59C 7D 22 C1 ADC $C122,x[$9B:C124] ;|
$9B:C59F 8D 08 0D STA $0D08 [$7E:0D08] ;/
$9B:C5A2 8D 16 0D STA $0D16 [$7E:0D16] ; Grapple beam start X position = [grapple beam end X position]
$9B:C5A5 68 PLA ;\
$9B:C5A6 18 CLC ;|
$9B:C5A7 7D 4A C1 ADC $C14A,x[$9B:C14C] ;} Grapple beam flare X position = [Samus X position] + [$C14A + [X]]
$9B:C5AA 8D 1A 0D STA $0D1A [$7E:0D1A] ;/
$9B:C5AD AD FA 0A LDA $0AFA [$7E:0AFA] ;\
$9B:C5B0 38 SEC ;|
$9B:C5B1 E5 16 SBC $16 [$7E:0016] ;|
$9B:C5B3 48 PHA ;} Grapple beam end Y position = [Samus Y position] + [grapple beam origin Y offset]
$9B:C5B4 18 CLC ;|
$9B:C5B5 7D 36 C1 ADC $C136,x[$9B:C138] ;|
$9B:C5B8 8D 0C 0D STA $0D0C [$7E:0D0C] ;/
$9B:C5BB 8D 18 0D STA $0D18 [$7E:0D18] ; Grapple beam start Y position = [grapple beam end Y position]
$9B:C5BE 68 PLA ;\
$9B:C5BF 18 CLC ;|
$9B:C5C0 7D 5E C1 ADC $C15E,x[$9B:C160] ;} Grapple beam flare Y position = [Samus Y position] - (Y offset of Samus projectile origin) + [$C15E + [X]]
$9B:C5C3 8D 1C 0D STA $0D1C [$7E:0D1C] ;/
$9B:C5C6 80 3E BRA $3E [$C606] ; Go to BRANCH_MERGE
; BRANCH_RUNNING
$9B:C5C8 BD 72 C1 LDA $C172,x[$9B:C182] ;\
$9B:C5CB 8D 02 0D STA $0D02 [$7E:0D02] ;} Grapple beam origin X offset = [$C172 + [X]]
$9B:C5CE BD 86 C1 LDA $C186,x[$9B:C196] ;\
$9B:C5D1 38 SEC ;|
$9B:C5D2 E5 16 SBC $16 [$7E:0016] ;} Grapple beam origin Y offset = [$C186 + [X]] - (Y offset of Samus projectile origin)
$9B:C5D4 8D 04 0D STA $0D04 [$7E:0D04] ;/
$9B:C5D7 AD F6 0A LDA $0AF6 [$7E:0AF6] ;\
$9B:C5DA 48 PHA ;|
$9B:C5DB 18 CLC ;} Grapple beam end X position = [Samus X position] + [grapple beam origin X offset]
$9B:C5DC 7D 72 C1 ADC $C172,x[$9B:C182] ;|
$9B:C5DF 8D 08 0D STA $0D08 [$7E:0D08] ;/
$9B:C5E2 8D 16 0D STA $0D16 [$7E:0D16] ; Grapple beam start X position = [grapple beam end X position]
$9B:C5E5 68 PLA ;\
$9B:C5E6 18 CLC ;|
$9B:C5E7 7D 9A C1 ADC $C19A,x[$9B:C1AA] ;} Grapple beam flare X position = [Samus X position] + [$C19A + [X]]
$9B:C5EA 8D 1A 0D STA $0D1A [$7E:0D1A] ;/
$9B:C5ED AD FA 0A LDA $0AFA [$7E:0AFA] ;\
$9B:C5F0 38 SEC ;|
$9B:C5F1 E5 16 SBC $16 [$7E:0016] ;|
$9B:C5F3 48 PHA ;} Grapple beam end Y position = [Samus Y position] + [grapple beam origin Y offset]
$9B:C5F4 18 CLC ;|
$9B:C5F5 7D 86 C1 ADC $C186,x[$9B:C196] ;|
$9B:C5F8 8D 0C 0D STA $0D0C [$7E:0D0C] ;/
$9B:C5FB 8D 18 0D STA $0D18 [$7E:0D18] ; Grapple beam start Y position = [grapple beam end Y position]
$9B:C5FE 68 PLA ;\
$9B:C5FF 18 CLC ;|
$9B:C600 7D AE C1 ADC $C1AE,x[$9B:C1BE] ;} Grapple beam flare Y position = [Samus Y position] - (Y offset of Samus projectile origin) + [$C1AE + [X]]
$9B:C603 8D 1C 0D STA $0D1C [$7E:0D1C] ;/
; BRANCH_MERGE
$9B:C606 9C 06 0D STZ $0D06 [$7E:0D06] ; Grapple beam end X subposition = 0
$9B:C609 9C 0A 0D STZ $0D0A [$7E:0D0A] ; Grapple beam end Y subposition = 0
$9B:C60C 9C 0E 0D STZ $0D0E [$7E:0D0E] ; Grapple beam end X suboffset = 0
$9B:C60F 9C 10 0D STZ $0D10 [$7E:0D10] ; Grapple beam end X offset = 0
$9B:C612 9C 12 0D STZ $0D12 [$7E:0D12] ; Grapple beam end Y suboffset = 0
$9B:C615 9C 14 0D STZ $0D14 [$7E:0D14] ; Grapple beam end Y offset = 0
$9B:C618 9C F4 0C STZ $0CF4 [$7E:0CF4] ; Grapple beam flags = 0
$9B:C61B A9 0C 00 LDA #$000C ;\
$9B:C61E 8D 00 0D STA $0D00 [$7E:0D00] ;} Grapple beam length delta = Ch
$9B:C621 9C FE 0C STZ $0CFE [$7E:0CFE] ; Grapple beam length = 0
$9B:C624 9C 26 0D STZ $0D26 [$7E:0D26] ; Grapple swing angular velocity = 0
$9B:C627 9C 28 0D STZ $0D28 [$7E:0D28] ; Grapple swing angular acceleration due to angle of swing = 0
$9B:C62A 9C 2A 0D STZ $0D2A [$7E:0D2A] ; Grapple swing angular acceleration due to button input = 0
$9B:C62D 9C 2C 0D STZ $0D2C [$7E:0D2C] ; Grapple swing angular deceleration = 0
$9B:C630 9C 2E 0D STZ $0D2E [$7E:0D2E] ; Extra grapple swing angular velocity = 0
$9B:C633 9C 30 0D STZ $0D30 [$7E:0D30] ; Grapple kick cooldown timer = 0
$9B:C636 9C 1E 0D STZ $0D1E [$7E:0D1E] ; $0D1E = 0 (unused)
$9B:C639 9C 20 0D STZ $0D20 [$7E:0D20] ; $0D20 = 0 (unused)
$9B:C63C A9 02 00 LDA #$0002 ;\
$9B:C63F 8D 3A 0D STA $0D3A [$7E:0D3A] ;} $0D3A = 2 (unused)
$9B:C642 9C 3C 0D STZ $0D3C [$7E:0D3C] ; $0D3C = 0 (unused)
$9B:C645 A9 05 00 LDA #$0005 ;\
$9B:C648 8D 3E 0D STA $0D3E [$7E:0D3E] ;} Grapple beam start animation timer = 5
$9B:C64B AD 42 C3 LDA $C342 [$9B:C342] ;\
$9B:C64E 8D 40 0D STA $0D40 [$7E:0D40] ;} Grapple beam start animation tile pointer = $8200
$9B:C651 9C 82 0D STZ $0D82 [$7E:0D82] ;\
$9B:C654 9C 84 0D STZ $0D84 [$7E:0D84] ;|
$9B:C657 9C 86 0D STZ $0D86 [$7E:0D86] ;|
$9B:C65A 9C 88 0D STZ $0D88 [$7E:0D88] ;|
$9B:C65D 9C 8A 0D STZ $0D8A [$7E:0D8A] ;} $0D82..91 = 0 (grapple beam collision temporaries)
$9B:C660 9C 8C 0D STZ $0D8C [$7E:0D8C] ;|
$9B:C663 9C 8E 0D STZ $0D8E [$7E:0D8E] ;|
$9B:C666 9C 90 0D STZ $0D90 [$7E:0D90] ;/
$9B:C669 9C 38 0D STZ $0D38 [$7E:0D38] ; Failed grapple swing movement counter = 0
$9B:C66C 9C 36 0D STZ $0D36 [$7E:0D36] ; Disable special grapple beam angle handling
$9B:C66F 9C F8 0C STZ $0CF8 [$7E:0CF8] ; Slow grapple scrolling flag = 0
$9B:C672 22 87 AF 94 JSL $94AF87[$94:AF87] ; Initialise grapple segment animations
$9B:C676 A9 86 EB LDA #$EB86 ;\
$9B:C679 8D 5C 0A STA $0A5C [$7E:0A5C] ;} Samus drawing handler = firing grapple beam
$9B:C67C 9C 9E 0A STZ $0A9E [$7E:0A9E] ; Grapple walljump timer = 0
$9B:C67F A9 02 00 LDA #$0002 ;\
$9B:C682 22 F0 AC 90 JSL $90ACF0[$90:ACF0] ;} Load ice beam palette
$9B:C686 A9 91 7F LDA #$7F91 ;\
$9B:C689 8F BE C1 7E STA $7EC1BE[$7E:C1BE] ;} Sprite palette 5 colour Fh = 7F91h
$9B:C68D A9 03 C7 LDA #$C703 ;\
$9B:C690 8D 32 0D STA $0D32 [$7E:0D32] ;} Grapple beam function = firing
$9B:C693 A9 05 00 LDA #$0005 ;\
$9B:C696 22 3F 90 80 JSL $80903F[$80:903F] ;} Queue sound 5, sound library 1, max queued sounds allowed = 1 (grapple start)
$9B:C69A A9 01 00 LDA #$0001 ;\
$9B:C69D 8D D0 0C STA $0CD0 [$7E:0CD0] ;} Beam charge counter = 1
$9B:C6A0 9C C0 0D STZ $0DC0 [$7E:0DC0] ; Resume charging beam sound effect flag = 0
$9B:C6A3 AD 58 0A LDA $0A58 [$7E:0A58] ;\
$9B:C6A6 C9 6E 94 CMP #$946E ;} If [Samus movement handler] = $946E (released from grapple swing):
$9B:C6A9 D0 06 BNE $06 [$C6B1] ;/
$9B:C6AB A9 37 A3 LDA #$A337 ;\
$9B:C6AE 8D 58 0A STA $0A58 [$7E:0A58] ;} Samus movement handler = $A337 (normal)
$9B:C6B1 60 RTS
}