Created
December 13, 2014 01:29
-
-
Save magical/938919185293e60e8c0c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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