ROM:080419A8 ; =============== S U B R O U T I N E ======================================= ROM:080419A8 ROM:080419A8 ; Attributes: bp-based frame ROM:080419A8 ROM:080419A8 ; void __fastcall inheritance(void *magicNums, void *pEggBase) ROM:080419A8 inheritance ; CODE XREF: sub_8041FC4+28p ROM:080419A8 ROM:080419A8 var_8 = -8 ROM:080419A8 var_s4 = 4 ROM:080419A8 ROM:080419A8 PUSH {R4-R7,LR} ROM:080419AA MOV R7, R9 ROM:080419AC MOV R6, R8 ROM:080419AE PUSH {R6,R7} ROM:080419B0 SUB SP, SP, #0x14 ROM:080419B2 MOV R9, R0 ROM:080419B4 MOV R8, R1 ; r8 = eggBase ROM:080419B6 MOVS R5, #0 ; int i = 0 ROM:080419B8 ADD R1, SP, #4 ; make pointer/local array for iv set (u8* (malloc(IV_SET))) ivArray ROM:080419BA ADD R7, SP, #0xC ; make pointer/local array for parents to inherit (u8* (malloc(IV_INHERIT)) parentArray ROM:080419BC ADDS R2, R1, #0 ; move current array pointer to r2(iv set array) ROM:080419BE ROM:080419BE fillIVArray ; CODE XREF: inheritance+22j ROM:080419BE ADDS R0, R2, R5 ; iv_array_pos = &ivArray + i, seek to desired pos ROM:080419C0 STRB R5, [R0] ; ivArray[i] = i ROM:080419C2 ADDS R0, R5, #1 ; for(i = 0; i < 6; ++i), increment here ROM:080419C4 LSLS R0, R0, #0x18 ; dumb typecasting ROM:080419C6 LSRS R5, R0, #0x18 ; dumb typecasting ROM:080419C8 CMP R5, #5 ; i < 6 ROM:080419CA BLS fillIVArray ; this past for loop fills the local declared ivArray with u8 ivArray = {00, 01, 02, 03, 04, 05} ROM:080419CC MOVS R5, #0 ; i = 0 ROM:080419CE ADDS R6, R1, #0 ; move current array pointer to r2(iv set array) ROM:080419D0 ROM:080419D0 pickIVInherit ; CODE XREF: inheritance+52j ROM:080419D0 BL rand ROM:080419D4 MOV R1, SP ; save array base ROM:080419D6 ADDS R4, R1, R5 ; save the current position of the array ROM:080419D8 LSLS R0, R0, #0x10 ; dumb typecasting ROM:080419DA LSRS R0, R0, #0x10 ; dumb typecasting ROM:080419DC MOVS R1, #6 ; IV_SET ROM:080419DE SUBS R1, R1, R5 ; IV_SET - i ROM:080419E0 BL mod ; rand() % (IV_SET - i) ROM:080419E4 ADDS R0, R6, R0 ; &temp_iv_array + (rand() % (IV_SET - i)), seek to specific pos in u8 array ROM:080419E6 LDRB R0, [R0] ; grab that byte from the array pos ROM:080419E8 STRB R0, [R4] ; store that byte to the new array, in order(3 runs, r4 = r1 + r5, new_array = array_base + i) ROM:080419EA LDRB R1, [R4] ; set byte from current array pos as a2, basically pass the byte number of the inherited iv.(0-5) ROM:080419EC MOVS R0, R6 ; pointer to array base as a1 ROM:080419EE BL doInheritanceCheck ROM:080419F2 ADDS R0, R5, #1 ; ++i ROM:080419F4 LSLS R0, R0, #0x18 ; i is apparently a u8? wtf gamefreak? ROM:080419F6 LSRS R5, R0, #0x18 ; gamefreak might actually be retarded ROM:080419F8 CMP R5, #2 ; i < 3 ROM:080419FA BLS pickIVInherit ROM:080419FC MOVS R5, #0 ; i = 0 ROM:080419FE MOVS R4, #1 ROM:08041A00 ROM:08041A00 pickParentInherit ; CODE XREF: inheritance+6Ej ROM:08041A00 BL rand ROM:08041A04 ADDS R1, R7, R5 ; parentArray[i] ROM:08041A06 LSLS R0, R0, #0x10 ; dumb typecasting ROM:08041A08 LSRS R0, R0, #0x10 ; dumb typecasting ROM:08041A0A ANDS R0, R4 ; rand() & 1 ROM:08041A0C STRB R0, [R1] ; store 0/1(to represent parent to pull iv from) to current array pos ROM:08041A0E ADDS R0, R5, #1 ; ++i ROM:08041A10 LSLS R0, R0, #0x18 ; i is apparently a u8. wtf. ROM:08041A12 LSRS R5, R0, #0x18 ROM:08041A14 CMP R5, #2 ; i < 3 ROM:08041A16 BLS pickParentInherit ROM:08041A18 MOVS R5, #0 ; i = 0 ROM:08041A1A ROM:08041A1A writeBackInheritance ; CODE XREF: inheritance+162j ROM:08041A1A MOV R1, SP ; base of array with ivs to inherit ROM:08041A1C ADDS R0, R1, R5 ; ivArray[i] ROM:08041A1E LDRB R0, [R0] ; *ivArray[i] ROM:08041A20 CMP R0, #5 ; if i is 0-5, do iv write. if greater, there's an error. return. ROM:08041A22 BHI return ; jumptable 08041A2C default case ROM:08041A24 LSLS R0, R0, #2 ; align for switch based on iv number ROM:08041A26 LDR R1, =jpt_8041A2C ROM:08041A28 ADDS R0, R0, R1 ROM:08041A2A LDR R0, [R0] ; get pc to jump to ROM:08041A2C MOV PC, R0 ; switch 6 cases ROM:08041A2C ; --------------------------------------------------------------------------- ROM:08041A2E DCW 0 ROM:08041A30 off_8041A30 DCD jpt_8041A2C ; DATA XREF: inheritance+7Er ROM:08041A34 jpt_8041A2C DCD HP_IV ; DATA XREF: inheritance+7Eo ROM:08041A34 ; inheritance:off_8041A30o ROM:08041A34 DCD ATK_IV ; jump table for switch statement ROM:08041A34 DCD DEF_IV ROM:08041A34 DCD SPA_IV ROM:08041A34 DCD SPD_IV ROM:08041A34 DCD SPE_IV ROM:08041A4C ; --------------------------------------------------------------------------- ROM:08041A4C ROM:08041A4C HP_IV ; CODE XREF: inheritance+84j ROM:08041A4C ; DATA XREF: inheritance:jpt_8041A2Co ROM:08041A4C ADDS R0, R7, R5 ; jumptable 08041A2C case 0 ROM:08041A4E LDRB R1, [R0] ROM:08041A50 LSLS R0, R1, #2 ROM:08041A52 ADDS R0, R0, R1 ROM:08041A54 LSLS R0, R0, #4 ROM:08041A56 ADD R0, R8 ROM:08041A58 MOVS R1, #0x27 ROM:08041A5A BL getPKMStat ROM:08041A5E ADD R2, SP, #0x10 ROM:08041A60 STRB R0, [R2] ROM:08041A62 MOV R0, R9 ROM:08041A64 MOVS R1, #0x27 ROM:08041A66 BL writeIVToEgg ROM:08041A6A B return ; jumptable 08041A2C default case ROM:08041A6C ; --------------------------------------------------------------------------- ROM:08041A6C ROM:08041A6C ATK_IV ; CODE XREF: inheritance+84j ROM:08041A6C ; DATA XREF: inheritance:jpt_8041A2Co ROM:08041A6C ADD R4, SP, #0x10 ROM:08041A6E ADDS R0, R7, R5 ROM:08041A70 LDRB R1, [R0] ROM:08041A72 LSLS R0, R1, #2 ROM:08041A74 ADDS R0, R0, R1 ROM:08041A76 LSLS R0, R0, #4 ROM:08041A78 ADD R0, R8 ROM:08041A7A MOVS R1, #0x28 ROM:08041A7C BL getPKMStat ROM:08041A80 STRB R0, [R4] ROM:08041A82 MOV R0, R9 ROM:08041A84 MOVS R1, #0x28 ROM:08041A86 B IV_WRITE ROM:08041A88 ; --------------------------------------------------------------------------- ROM:08041A88 ROM:08041A88 DEF_IV ; CODE XREF: inheritance+84j ROM:08041A88 ; DATA XREF: inheritance:jpt_8041A2Co ROM:08041A88 ADD R4, SP, #0x10 ; jumptable 08041A2C case 2 ROM:08041A8A ADDS R0, R7, R5 ; parentArray[i] ROM:08041A8C LDRB R1, [R0] ; *parentArray[i] ROM:08041A8E LSLS R0, R1, #2 ; 0 * 4 or 1 * 4 depending on which parent ROM:08041A90 ADDS R0, R0, R1 ; 4 or 5 ROM:08041A92 LSLS R0, R0, #4 ROM:08041A94 ADD R0, R8 ; eggBase + parentIV ROM:08041A96 MOVS R1, #0x29 ; pkm field to write ROM:08041A98 BL getPKMStat ROM:08041A9C STRB R0, [R4] ROM:08041A9E MOV R0, R9 ROM:08041AA0 MOVS R1, #0x29 ROM:08041AA2 B IV_WRITE ROM:08041AA4 ; --------------------------------------------------------------------------- ROM:08041AA4 ROM:08041AA4 SPA_IV ; CODE XREF: inheritance+84j ROM:08041AA4 ; DATA XREF: inheritance:jpt_8041A2Co ROM:08041AA4 ADD R4, SP, #0x10 ; jumptable 08041A2C case 3 ROM:08041AA6 ADDS R0, R7, R5 ROM:08041AA8 LDRB R1, [R0] ROM:08041AAA LSLS R0, R1, #2 ROM:08041AAC ADDS R0, R0, R1 ROM:08041AAE LSLS R0, R0, #4 ROM:08041AB0 ADD R0, R8 ROM:08041AB2 MOVS R1, #0x2A ROM:08041AB4 BL getPKMStat ROM:08041AB8 STRB R0, [R4] ROM:08041ABA MOV R0, R9 ROM:08041ABC MOVS R1, #0x2A ROM:08041ABE B IV_WRITE ROM:08041AC0 ; --------------------------------------------------------------------------- ROM:08041AC0 ROM:08041AC0 SPD_IV ; CODE XREF: inheritance+84j ROM:08041AC0 ; DATA XREF: inheritance:jpt_8041A2Co ROM:08041AC0 ADD R4, SP, #0x10 ; jumptable 08041A2C case 4 ROM:08041AC2 ADDS R0, R7, R5 ROM:08041AC4 LDRB R1, [R0] ROM:08041AC6 LSLS R0, R1, #2 ROM:08041AC8 ADDS R0, R0, R1 ROM:08041ACA LSLS R0, R0, #4 ROM:08041ACC ADD R0, R8 ROM:08041ACE MOVS R1, #0x2B ROM:08041AD0 BL getPKMStat ROM:08041AD4 STRB R0, [R4] ROM:08041AD6 MOV R0, R9 ROM:08041AD8 MOVS R1, #0x2B ROM:08041ADA ROM:08041ADA IV_WRITE ; CODE XREF: inheritance+DEj ROM:08041ADA ; inheritance+FAj ... ROM:08041ADA MOVS R2, R4 ROM:08041ADC BL writeIVToEgg ROM:08041AE0 B return ; jumptable 08041A2C default case ROM:08041AE2 ; --------------------------------------------------------------------------- ROM:08041AE2 ROM:08041AE2 SPE_IV ; CODE XREF: inheritance+84j ROM:08041AE2 ; DATA XREF: inheritance:jpt_8041A2Co ROM:08041AE2 ADD R4, SP, #0x10 ; jumptable 08041A2C case 5 ROM:08041AE4 ADDS R0, R7, R5 ROM:08041AE6 LDRB R1, [R0] ROM:08041AE8 LSLS R0, R1, #2 ROM:08041AEA ADDS R0, R0, R1 ROM:08041AEC LSLS R0, R0, #4 ROM:08041AEE ADD R0, R8 ROM:08041AF0 MOVS R1, #0x2C ROM:08041AF2 BL getPKMStat ROM:08041AF6 STRB R0, [R4] ROM:08041AF8 MOV R0, R9 ROM:08041AFA MOVS R1, #0x2C ROM:08041AFC MOVS R2, R4 ROM:08041AFE BL writeIVToEgg ROM:08041B02 ROM:08041B02 return ; CODE XREF: inheritance+7Aj ROM:08041B02 ; inheritance+C2j ... ROM:08041B02 ADDS R0, R5, #1 ; ++i ROM:08041B04 LSLS R0, R0, #0x18 ROM:08041B06 LSRS R5, R0, #0x18 ROM:08041B08 CMP R5, #2 ; i < 3 ROM:08041B0A BLS writeBackInheritance ROM:08041B0C ADD SP, SP, #0x14 ROM:08041B0E POP {R3,R4} ROM:08041B10 MOV R8, R3 ROM:08041B12 MOV R9, R4 ROM:08041B14 POP {R4-R7} ROM:08041B16 POP {R0} ROM:08041B18 BX R0 ROM:08041B18 ; End of function inheritance