Thread: Development: Uncatchable Pokemon
View Single Post
Old July 6th, 2011 (1:41 PM). Edited July 11th, 2011 by NintendoBoyDX.
NintendoBoyDX NintendoBoyDX is offline
    Join Date: Jul 2010
    Gender: Male
    Posts: 94
    To clear something up 02022b4c is value checked by several routines (for more than one thing). This value is set at the routine for special 0x156 (this routine is called by a special pokemon battle, not the special). It checks a word at 02022b4c, if the 3rd byte of the word is 80, you don't have the silph scope, marowak doesn't appear and can't be battled. If it's set it to A0 you do have the silph scope, marowak appears and can be battled. Either way, it is still uncatchable. Also I say "3rd byte of the word" but when the game writes the value, it writes it as a halfword.

    Example of what the byte would look like: 0000A000, 00008004
    Special 0x156 routine: 0807F904

    If you go into a wild battle, and have it break at the first write to 02022b4c, then write 0000a000, you'll get the ghost to show up, and the marowak-animation sequence with an uncatchable pokemon. If you write 00008000, you'll get the ghost to show up, but you won't be able to identify or battle it. No matter what, the pokemon is uncatchable. So I'm sure that the catchable/uncatchable value is either stored somewhere completely different, or at 02022b4c at a different point in time.

    Also, while testing, I found that setting the last byte to 1C will get you the tutorial battle with Gary/Oak.

    The script that the marowak uses: 081634B8
    #org 0x1634B8
    textcolor 0x2
    msgbox 0x817A2F8 MSG_KEEPOPEN '"Be gone[.]\nIntruders[.]"
    special 0x187
    compare LASTRESULT 0x2
    if 0x1 goto 0x81A7AE0
    wildbattle2 0x69 0x1E 0x0 0x6
    special 0x188
    compare LASTRESULT 0x0
    if 0x1 goto 0x81634F5
    applymovement MOVE_PLAYER 0x8163512
    waitmovement 0x0

    #org 0x1A7AE0

    #org 0x1634F5
    preparemsg 0x817A30C '"The ghost was the restless spirit\..."
    cry 0x69 0x0
    msgbox 0x817A342 MSG_KEEPOPEN '"The mother's spirit was calmed.\pI..."
    setvar 0x4059 0x1

    ' Strings
    #org 0x17A2F8
    = Be gone[.]\nIntruders[.]

    #org 0x17A30C
    = The ghost was the restless spirit\nof CUBONE's mother!

    #org 0x17A342
    = The mother's spirit was calmed.\pIt departed to the afterlife[.]

    ' Movements
    #org 0x163512
    #raw 0x11 'Step Up (Normal)
    #raw 0xFE 'End of Movements

    Special 0x156 is never used, but it's routine is called by the wildbattle2 (or it could be one of the two other special commands for all I know).

    0807F730 is a check for a regular pokemon vs wild ghost pokemon battle. If 0 is set then 0 is stored at 02022b4c and you get a regular battle, if 1 is set then you get a unidentified ghost pokemon battle.

    Also while messing around, I found out that the tutorial battle vs gary happens when you set the last byte equal to 1c. It does take priority over the ghost battles so that gets mention.

    EDIT: I've figured out how make a pokemon uncatchable.
    During a battle set the word 02022b4c equal to 0x8000. After refreshing the battle(go into your bag or something), it becomes an uncatchable ghost.

    If you set it to 0xA000 however, it becomes an uncatchable pokemon.

    It's worth mention that setting it to 0x2000 does not make a pokemon uncatchable. So it's not 1 bit that makes it uncatchable.

    0x8000 - (00000000000000001000000000000000) Uncatchable ghost, does not change the name to ghost though.
    0xA000 - (00000000000000001010000000000000) Uncatchable pokemon.
    0x2000 - (00000000000000000010000000000000) I speculated that it would make the pokemon uncatchable but it does NOT. YOU get a regular battle, a catchable pokemon if you set it equal to this.

    - However, the problem with setting it equal to 0xA000 before the battle is the text still prints that a "ghost appears" and then it goes through the animation and prints "it was a mother marowak."
    - I think the bit set with 0x2000 is the silph scope bit somehow.
    Reply With Quote