The PokéCommunity Forums Fan Games ROM Hacking Tools, Tutorials & Resources
Tutorial ROUTINE ASM: Change status of pokemon

Tools, Tutorials & Resources Various tools to help you develop your hacks can be found here.

Reply
 
Thread Tools
  #1    
Old October 20th, 2013 (3:20 AM).
~Andrea's Avatar
~Andrea ~Andrea is offline
     
    Join Date: Oct 2012
    Gender: Male
    Posts: 169
    Hello guys today I would like to offer you a little routine for asm
    change the status of a pokemon of our team
    first of all we need to know where is the offset required in this case:
    offset_stato: 030043B0
    the bytes of the pokemon from each team are distant from each other than 100 bytes
    this is the routin we will use:
    Spoiler:

    .thumb
    .align 2

    push {r0-r1,lr}
    ldr r0, .8000 /*variabile 8000*/
    ldrh r0,[r0]
    ldr r1,.100 /*interval between the bytes status in pokemon team*/
    mul r1,r0
    ldr r0, .pokemon_data /*byte team pokemon status*/
    add r0, r0, r1
    mov r1, #0x80 /*poisong status*/
    strb r1,[r0]
    pop {r0-r1,pc}

    .align 2
    .pokemon_data:
    .word 0x030043B0
    .8000:
    .word 0x0202e8c4
    .100:
    .word 0x00000100

    but we look for good everywhere:
    Quote:
    ldr r0 ,.8000
    ldrh r0, [r0]
    except in 8000 var r0
    Quote:
    ldr r1,.100
    mul r1, r0
    So here, we load the value "100" in r1 and then multiply it with r0 (the var 8000)
    because we did? to choose the pokemon you want to change the status first of all we need to set the var 8000 with the number of pokemon to infect -1 for example, the 2 pokemon in team
    setvar 0x8000 0x1 ( -1 we have to do to place in the team)
    we said that the bytes of the team move away from each other by 100 bytes then the routine will multiply 1 by 100
    1x100=100
    then adds +100 to pokemon_data and we will have the offset of the state of 2 pokemon
    Quote:
    ldr r0 ,.pokemon_data
    add r0,r0 ,r1
    as I said before, the routine loads the pokemon_data and the sum of the product of the variable * 100.
    sum pokemon_data + product and puts everything in r0
    Quote:
    mov r1 , # 0x80
    strb r1, [ r0 ]
    we r1 in the value of 80 (he was poisoned),and finally save the byte
    Spoiler:

    # dynamic 0x800000
    # org @ start
    lock
    setvar 0x8000 0x1
    callasm 0xoffset + 1
    release
    end



    this is the compiled routine:
    Quote:
    03 B5 05 48 00 88 05 49 41 43 02 48 40 18 80 21 01 70 03 BD B0 43 00 03 C4 E8 02 02 00 01 00 00
    Quote:
    80 21
    80 21 corresponds to our mov r1, # 0x80 then to change the status of the pokemon for example we have to change the byte 80

    here we are given vary status byte:
    sleeping: 01
    burned: 10
    frozen: 20
    paralized: 40

    If you have any questions or concerns do not hesitate to ask
    __________________
    Reply With Quote

    Relevant Advertising!

      #2    
    Old October 23rd, 2013 (3:55 AM).
    kearnseyboy6's Avatar
    kearnseyboy6 kearnseyboy6 is offline
    Aussie's Toughest Mudder
       
      Join Date: Dec 2008
      Posts: 300
      This is a great tutorial, great place to start with little ASM skills (it's the first place I went to) but the tutorial is very specific, especially when the pokemon data block contains so much more information to edit like its level, any stat, pokerus, nickname. This is just a suggestion but it could really broaden your tutorial. It's still great how ever!

      Also I think when you select a pokemon from a 'special' (i forget which one) it stores the variable into 0x8004 as either (0,1,2,3,4,5) for the slot which can be used to allow the player to select a pokemon.
      __________________
      HOLIDAYING CURRENTLY!!
      Reply With Quote
        #3    
      Old October 23rd, 2013 (4:47 AM).
      Jambo51's Avatar
      Jambo51 Jambo51 is offline
      Glory To Arstotzka
         
        Join Date: Jun 2009
        Gender: Male
        Nature: Quiet
        Posts: 732
        While this will work, you should absolutely never directly access the Pokémon data. You should always use the built in encrypter to set data.

        The reason being that the checksum can be affected by writes to the data, and not updating it correctly will result in your nice shiny Pokémon turning into a bad egg. Also, most of the encryption functions have built in checks and balances to prevent you writing nonsense data in. Just a little advice for you.
        __________________
        Hey guys, please check out my recreations of the gen 1 and 2 music on my custom engine at my SoundCloud! - Here!
        Reply With Quote
        Reply
        Quick Reply

        Sponsored Links
        Thread Tools

        Posting Rules
        You may not post new threads
        You may not post replies
        You may not post attachments
        You may not edit your posts

        BB code is On
        Smilies are On
        [IMG] code is On
        HTML code is Off

        Forum Jump


        All times are GMT -8. The time now is 2:45 AM.