View Single Post
  #1    
Old February 3rd, 2010, 02:36 PM
HackMew's Avatar
HackMew
Mewtwo Strikes Back
 
Join Date: Jun 2006

Brief Intro


Here I've got a couple of routines for you. They are designed to get the minimum and maximum levels respectively.

Description


As you can see, the routines are pretty short and simple so I did not comment them on purpose.
Either way, here's a brief description of what happens:
  1. Get the Pokémon party level address into r1.
  2. Load the first value into r0, and assume it's the minimum (or maximum) value yet.
  3. Loop 5 times, and update the mininum (or maximum) value if needed.
  4. Get the LASTRESULT var address into r1 and store the minimum (or maximum) level.
The minimum routine, however, is slighty different because a zero-level is not an acceptable value so there's an extra check to take that into account (otherwhise as long as your team is not full, the minimum level would always be zero, which is no good obviously). That also means the routine will loop up to 5 times rather than always 5 as it happens in the maximum routine.

The Code


GetMinPartyLevel


  • FireRed/LeafGreen

    Code:
    .text .align 2 .thumb .thumb_func .global GetMinPartyLevel main: push {r0-r3, lr} ldr r1, .PARTY_LVL ldrb r0, [r1] mov r3, #0x5 loop: add r1, #0x64 ldrb r2, [r1] cmp r2, #0x0 beq return cmp r2, r0 bge next add r0, r2, #0x0 next: sub r3, #0x1 cmp r3, #0x0 bne loop return: ldr r1, .VAR strh r0, [r1] pop {r0-r3, pc} .align 2 .PARTY_LVL: .word 0x02024284 + 0x54 .VAR: .word 0x020270B6 + (0x800D * 2)
  • Ruby/Sapphire

    Note: The routine is the same as the FR/LG one; just replace the bottom part with the following:

    Code:
    .align 2 .PARTY_LVL: .word 0x03004360 + 0x54 .VAR: .word 0x0201E8C2 + (0x800D * 2)
  • Emerald

    Note: The routine is the same as the FR/LG one; just replace the bottom part with the following:

    Code:
    .align 2 .PARTY_LVL: .word 0x020244EC + 0x54 .VAR: .word 0x020275D6 + (0x800D * 2)

GetMaxPartyLevel


  • FireRed/LeafGreen

    Code:
    .text .align 2 .thumb .thumb_func .global GetMaxPartyLevel main: push {r0-r3, lr} ldr r1, .PARTY_LVL ldrb r0, [r1] mov r3, #0x5 loop: add r1, #0x64 ldrb r2, [r1] cmp r2, r0 ble next add r0, r2, #0x0 next: sub r3, #0x1 cmp r3, #0x0 bne loop return: ldr r1, .VAR strh r0, [r1] pop {r0-r3, pc} .align 2 .PARTY_LVL: .word 0x02024284 + 0x54 .VAR: .word 0x020270B6 + (0x800D * 2)
  • Ruby/Sapphire

    Note: The routine is the same as the FR/LG one; just replace the bottom part with the following:

    Code:
    .align 2 .PARTY_LVL: .word 0x03004360 + 0x54 .VAR: .word 0x0201E8C2 + (0x800D * 2)
  • Emerald

    Note: The routine is the same as the FR/LG one; just replace the bottom part with the following:

    Code:
    .align 2 .PARTY_LVL: .word 0x020244EC + 0x54 .VAR: .word 0x020275D6 + (0x800D * 2)

This research document is Copyright © 2010 by HackMew.
You are not allowed to copy, modify or distribute it without permission.
__________________

Last edited by HackMew; April 19th, 2010 at 12:15 AM.
Reply With Quote