Skip to content

Instantly share code, notes, and snippets.

@magical
Created December 13, 2014 01:29
Show Gist options
  • Save magical/938919185293e60e8c0c to your computer and use it in GitHub Desktop.
Save magical/938919185293e60e8c0c to your computer and use it in GitHub Desktop.
; arguments
; ???
; ???
; target pokemon
; ball
; shakes (out param)
; crit (out param)
; output
; returns whether capture succeeded
; [r4] number of shakes
; [r5] was critical capture
;
021CB974: B5F8 push {r3,r4,r5,r6,r7,lr}
021CB976: B086 sub sp, #x18
021CB978: 9D0D ldr r5,[sp, #x34]
021CB97A: 9000 str r0,[sp]
021CB97C: 9302 str r3,[sp, #8] ; save ball in sp+8
021CB97E: 2000 mov r0, #0
021CB980: 7028 strb r0,[r5]
021CB982: 9802 ldr r0,[sp, #8] ; load ball into r0
021CB984: 1C17 mov r7, r2
021CB986: 9101 str r1,[sp, #4]
021CB988: 9C0C ldr r4,[sp, #x30]
; if r0 == 1 (master ball), capture succeeds
021CB98A: 2801 cmp r0, #1
021CB98C: D104 bne .notMasterBall
021CB98E: 2003 mov r0, #3
021CB990: 7020 strb r0,[r4]
021CB992: B006 add sp, #x18
021CB994: 2001 mov r0, #1
021CB996: BDF8 pop {r3,r4,r5,r6,r7,pc}
.notMasterBall:
; Health calculation
021CB998: 1C38 mov r0, r7 ; get max health
021CB99A: 210E mov r1, #E
021CB99C: F009FF3A bl 021D5814
021CB9A0: 0041 lsl r1, r0, #1 ; multiply by 3
021CB9A2: 1840 add r0, r0, r1
021CB9A4: 9003 str r0,[sp, #C]
021CB9A6: 1C38 mov r0, r7 ; get current hp
021CB9A8: 210D mov r1, #D
021CB9AA: F009FF33 bl 021D5814
021CB9AE: 0041 lsl r1, r0, #1 ; multiply by 2
021CB9B0: 9803 ldr r0,[sp, #C]
021CB9B2: 1A40 sub r0, r0, r1 ; max hp*3 - cur hp*2
021CB9B4: D008 beq .label1
021CB9B6: 0300 lsl r0, r0, #C
021CB9B8: F6D0E9B6 blx 0209BD28 ; convert to float
021CB9BC: 1C01 mov r1, r0
021CB9BE: 203F mov r0, #x3F ; r0 = .5
021CB9C0: 0600 lsl r0, r0, #x18
021CB9C2: F6D0EF5E blx 0209C880 ; add?
021CB9C6: E006 b .label2
.label1:
021CB9C8: 0300 lsl r0, r0, #C
021CB9CA: F6D0E9AE blx 0209BD28 ; convert to float
021CB9CE: 213F mov r1, #x3F ; r0 = .5
021CB9D0: 0609 lsl r1, r1, #x18
021CB9D2: F6D1E86E blx 0209CAB0 ; subtract?
.label2:
021CB9D6: F6D0ECF0 blx 0209C3B8 ; convert to int
021CB9DA: 1C06 mov r6, r0
; Dark grass penalty (probably)
021CB9DC: 9800 ldr r0,[sp]
021CB9DE: 2120 mov r1, #x20
021CB9E0: 6840 ldr r0,[r0, #4]
021CB9E2: F7EEFB41 bl 021BA068
021CB9E6: 2800 cmp r0, #0
021CB9E8: D010 beq .label3
021CB9EA: 9800 ldr r0,[sp]
021CB9EC: F000F8A2 bl 021CBB34
021CB9F0: 1C02 mov r2, r0
021CB9F2: 17F1 asr r1, r6, #x1F
021CB9F4: 1C30 mov r0, r6
021CB9F6: 17D3 asr r3, r2, #x1F
021CB9F8: F6D0EABE blx 0209BF78 ; 64-bit multiply
021CB9FC: 2220 mov r2, #x20
021CB9FE: 2300 mov r3, #0
021CBA00: 0192 lsl r2, r2, #6
021CBA02: 1880 add r0, r0, r2
021CBA04: 4159 adc r1, r3
021CBA06: 0509 lsl r1, r1, #x14
021CBA08: 0B06 lsr r6, r0, #C
021CBA0A: 430E orr r6, r1
.label3:
; Get capture rate (probably)
021CBA0C: 1C38 mov r0, r7
021CBA0E: F009FC49 bl 021D52A4
021CBA12: 9004 str r0,[sp, #x10]
021CBA14: 1C38 mov r0, r7
021CBA16: 2113 mov r1, #x13
021CBA18: F009FEFC bl 021D5814
021CBA1C: 0400 lsl r0, r0, #x10
021CBA1E: 0C01 lsr r1, r0, #x10
021CBA20: 9804 ldr r0,[sp, #x10]
021CBA22: 2208 mov r2, #8
021CBA24: F64EF9B4 bl 02019D90
021CBA28: 0400 lsl r0, r0, #x10
021CBA2A: 0C00 lsr r0, r0, #x10
; multiply intermediate value by capture rate
021CBA2C: 4370 mul r0, r6
021CBA2E: 1C06 mov r6, r0
; Get ball bonus
021CBA30: 9800 ldr r0,[sp]
021CBA32: 9901 ldr r1,[sp, #4]
021CBA34: 9B02 ldr r3,[sp, #8]
021CBA36: 1C3A mov r2, r7
021CBA38: F000F8A6 bl 021CBB88
; Multiply intermediate value by ball bonus
021CBA3C: 1C02 mov r2, r0
021CBA3E: 17F1 asr r1, r6, #x1F
021CBA40: 1C30 mov r0, r6
021CBA42: 17D3 asr r3, r2, #x1F
021CBA44: F6D0EA98 blx 0209BF78
021CBA48: 2208 mov r2, #8
021CBA4A: 0212 lsl r2, r2, #8
021CBA4C: 1880 add r0, r0, r2
021CBA4E: 4A38 ldr r2,=#0
021CBA50: 4151 adc r1, r2
021CBA52: 0509 lsl r1, r1, #x14
021CBA54: 0B00 lsr r0, r0, #C
021CBA56: 4308 orr r0, r1
; divide by 3*max HP
021CBA58: 9903 ldr r1,[sp, #C]
021CBA5A: F6D0EBBC blx 0209C1D4
021CBA5E: 1C06 mov r6, r0
; Status bonus
021CBA60: 1C38 mov r0, r7 ; get status (probably)
021CBA62: F00AFB51 bl 021D6108
021CBA66: 2805 cmp r0, #5 ; set up jump table
021CBA68: D81E bhi .noStatusBonus
021CBA6A: 1800 add r0, r0, r0
021CBA6C: 4478 add r0, pc
021CBA6E: 88C0 ldrh r0,[r0, #6]
021CBA70: 0400 lsl r0, r0, #x10
021CBA72: 1400 asr r0, r0, #x10
021CBA74: 4487 add pc, r0
; jmp table
021CBA76: 0030 dw .noStatusBonus
021CBA78: 0012 dw .smallStatusBonus
021CBA7A: 000A dw .largeStatusBonus
021CBA7C: 000A dw .largeStatusBonus
021CBA7E: 0012 dw .smallStatusBonus
021CBA80: 0012 dw .smallStatusBonus
.largeStatusBonus:
021CBA82: 17F1 asr r1, r6, #x1F
021CBA84: 1C30 mov r0, r6
021CBA86: 220A mov r2, #A ; A<<A = 0x2800 = 2.5
021CBA88: E002 b .multiply
.smallStatusBonus:
021CBA8A: 17F1 asr r1, r6, #x1F
021CBA8C: 1C30 mov r0, r6
021CBA8E: 2206 mov r2, #6 ; 6<<A = 0x1800 = 1.5
.multiply
021CBA90: 0292 lsl r2, r2, #A
021CBA92: 2300 mov r3, #0
021CBA94: F6D0EA70 blx 0209BF78
; round
021CBA98: 2208 mov r2, #8
021CBA9A: 0212 lsl r2, r2, #8
021CBA9C: 1882 add r2, r0, r2
021CBA9E: 4824 ldr r0,=#0
021CBAA0: 4141 adc r1, r0
021CBAA2: 0508 lsl r0, r1, #x14
021CBAA4: 0B16 lsr r6, r2, #C
021CBAA6: 4306 orr r6, r0
.noStatusBonus:
; Entralink power
021CBAA8: 1C30 mov r0, r6
021CBAAA: F645FBFB bl 020112A4
021CBAAE: 1C07 mov r7, r0
; Critical capture
021CBAB0: 9800 ldr r0,[sp]
021CBAB2: 1C39 mov r1, r7
021CBAB4: F000F918 bl 021CBCE8
021CBAB8: 7028 strb r0,[r5]
; If result is >= 255.0, capture succeeds
021CBABA: 20FF mov r0, #xFF
021CBABC: 0300 lsl r0, r0, #C
021CBABE: 4287 cmp r7, r0
021CBAC0: 7828 ldrb r0,[r5]
021CBAC2: DB08 blt .performShakeChecks
; set shakes to 1 if crit, else 3
021CBAC4: 2800 cmp r0, #0
021CBAC6: D001 beq .label5
021CBAC8: 2001 mov r0, #1
021CBACA: E000 b .label6
.label5:
021CBACC: 2003 mov r0, #3
.label6:
021CBACE: B006 add sp, #x18
021CBAD0: 7020 strb r0,[r4]
021CBAD2: 2001 mov r0, #1
021CBAD4: BDF8 pop {r3,r4,r5,r6,r7,pc}
.performShakeChecks:
; set max. shakes to 1 if crit, else 3
021CBAD6: 2601 mov r6, #1
021CBAD8: 2800 cmp r0, #0
021CBADA: D100 bne .label8
021CBADC: 2603 mov r6, #3
.label8:
; compute fourth root of (255.0 / r7)
021CBADE: 20FF mov r0, #xFF
021CBAE0: 0300 lsl r0, r0, #C
021CBAE2: 1C39 mov r1, r7
021CBAE4: F6B0EDD2 blx 0207C68C ; div
021CBAE8: F6B0EDF6 blx 0207C6D8 ; sqrt
021CBAEC: F6B0EDF4 blx 0207C6D8 ; sqrt
021CBAF0: 1C01 mov r1, r0
; divide 65536 by the above
021CBAF2: 2001 mov r0, #1 ; 1<<1C == 0x10000<<C == 65536.0
021CBAF4: 0700 lsl r0, r0, #x1C
021CBAF6: F6B0EDCA blx 0207C68C
021CBAFA: 2500 mov r5, #0
021CBAFC: 1307 asr r7, r0, #C ; truncate result
021CBAFE: 7025 strb r5,[r4] ; set shakes to 0
021CBB00: 2E00 cmp r6, #0 ; if max. shakes is <= 0, capture succeeds (not possible)
021CBB02: D912 bls .success
021CBB04: 2001 mov r0, #1 ; r0 = 65536
021CBB06: 0700 lsl r0, r0, #x1C
021CBB08: 0B00 lsr r0, r0, #C
021CBB0A: 9005 str r0,[sp, #x14]
.loop:
021CBB0C: 9805 ldr r0,[sp, #x14]
021CBB0E: F00BFDFB bl 021D7708 ; rand
021CBB12: 42B8 cmp r0, r7 ; if rand(65536) >= r7, capture fails
021CBB14: D203 bhs .fail
021CBB16: 7820 ldrb r0,[r4] ; increment shakes
021CBB18: 1C40 add r0, r0, #1
021CBB1A: 7020 strb r0,[r4]
021CBB1C: E002 b .next
.fail:
021CBB1E: B006 add sp, #x18
021CBB20: 2000 mov r0, #0
021CBB22: BDF8 pop {r3,r4,r5,r6,r7,pc}
.next:
021CBB24: 1C6D add r5, r5, #1 ; increment counter
021CBB26: 42B5 cmp r5, r6 ; loop while counter < max. shakes
021CBB28: D3F0 blo .loop
.success:
021CBB2A: 2001 mov r0, #1
021CBB2C: B006 add sp, #x18
021CBB2E: BDF8 pop {r3,r4,r5,r6,r7,pc}
; Get pokemon status(?) routine
021D6108: 2201 mov r2, #1 ; r2 = 1
.loop: ; do {
021D610A: 0091 lsl r1, r2, #2 ; r1 = r0[0x1C + r2*4]
021D610C: 1841 add r1, r0, r1
021D610E: 69C9 ldr r1,[r1, #x1C] ;
021D6110: 0749 lsl r1, r1, #x1D ; r1 = r1&7
021D6112: 0F49 lsr r1, r1, #x1D
021D6114: D001 beq .keepGoing ; if r1 != 0,
021D6116: 1C10 mov r0, r2 ; return r2
021D6118: 4770 bx lr
.keepGoing
021D611A: 1C52 add r2, r2, #1 ; r2 += 1
021D611C: 2A06 cmp r2, #6 ; } while (r2 < 6)
021D611E: D3F4 blo .loop
021D6120: 2000 mov r0, #0
021D6122: 4770 bx lr
; Critical capture routine
021CBCE8: B570 push {r4,r5,r6,lr}
021CBCEA: 6840 ldr r0,[r0, #4]
021CBCEC: 1C0C mov r4, r1
021CBCEE: F7ECFC85 bl 021B85FC
021CBCF2: 2296 mov r2, #x96 ; r2 = 0x96<<2 = 150*4 = 600
021CBCF4: 0092 lsl r2, r2, #2
021CBCF6: 4290 cmp r0, r2
021CBCF8: D902 bls .label1
021CBCFA: 220A mov r2, #A ; bonus = A<<A = 0x2800 = 2.5
.label0:
021CBCFC: 0292 lsl r2, r2, #A
021CBCFE: E015 b .label7
.label1:
021CBD00: 1C11 mov r1, r2 ; r1 = 600-150 = 450
021CBD02: 3996 sub r1, #x96
021CBD04: 4288 cmp r0, r1
021CBD06: D902 bls .label3
021CBD08: 2202 mov r2, #2 ; bonus = 2.0
.label2:
021CBD0A: 0312 lsl r2, r2, #C
021CBD0C: E00E b .label7
.label3:
021CBD0E: 0851 lsr r1, r2, #1 ; r1 = 600>>1 = 300
021CBD10: 4288 cmp r0, r1
021CBD12: D901 bls .label4
021CBD14: 2206 mov r2, #6 ; bonus = 6<<A = 0x1800 = 1.5
021CBD16: E7F1 b .label0
.label4:
021CBD18: 2896 cmp r0, #x96 ; 150
021CBD1A: D901 bls .label5
021CBD1C: 2201 mov r2, #1 ; bonus = 1.0
021CBD1E: E7F4 b .label2
.label5:
021CBD20: 281E cmp r0, #x1E
021CBD22: D901 bls .label6
021CBD24: 2202 mov r2, #2 ; bonus = 2<<A = .5
021CBD26: E7E9 b .label0
.label6:
021CBD28: 2000 mov r0, #0
021CBD2A: BD70 pop {r4,r5,r6,pc}
.label7:
; Cap capture chance at 255.0
021CBD2C: 20FF mov r0, #xFF
021CBD2E: 0300 lsl r0, r0, #C
021CBD30: 4284 cmp r4, r0
021CBD32: DD00 ble .label8
021CBD34: 1C04 mov r4, r0
.label8:
; Multiply capture chance by bonus
021CBD36: 17E1 asr r1, r4, #x1F
021CBD38: 1C20 mov r0, r4
021CBD3A: 17D3 asr r3, r2, #x1F
021CBD3C: F6D0E91C blx 0209BF78
; round
021CBD40: 2202 mov r2, #2
021CBD42: 2600 mov r6, #0
021CBD44: 0292 lsl r2, r2, #A
021CBD46: 1880 add r0, r0, r2
021CBD48: 4171 adc r1, r6
021CBD4A: 0509 lsl r1, r1, #x14
021CBD4C: 0B00 lsr r0, r0, #C
021CBD4E: 4308 orr r0, r1
; divide by 6
021CBD50: 2506 mov r5, #6
021CBD52: 2106 mov r1, #6
021CBD54: F6D0E938 blx 0209BFC8
; if a rand(256) is < the result, we got a crit
021CBD58: 35FA add r5, #xFA
021CBD5A: 1C04 mov r4, r0
021CBD5C: 1C28 mov r0, r5
021CBD5E: F00BFCD3 bl 021D7708 ; rand
021CBD62: 1321 asr r1, r4, #C ; truncate chance
021CBD64: 4288 cmp r0, r1 ; compare to rand
021CBD66: D201 bhs .label9
021CBD68: 2001 mov r0, #1 ; return 1
021CBD6A: BD70 pop {r4,r5,r6,pc}
.label9:
021CBD6C: 1C30 mov r0, r6 ; return 0
021CBD6E: BD70 pop {r4,r5,r6,pc}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment