• Our software update is now concluded. You will need to reset your password to log in. In order to do this, you will have to click "Log in" in the top right corner and then "Forgot your password?".
  • Welcome to PokéCommunity! Register now and join one of the best fan communities on the 'net to talk Pokémon and more! We are not affiliated with The Pokémon Company or Nintendo.

I'd like to bounce an idea off you guys: Difficult Pokemon Without the Grind

417
Posts
9
Years
    • Seen Nov 20, 2016
    Wait, I don;t understand why the early battles are slow.. I mean, obviously if you tested it and that's how it was, I can't argue with that, but if your attacking stats as well as the defending stats are raised equally, (or to a similar standard) shouldn't that balance out?
    http://bulbapedia.bulbagarden.net/wiki/Damage#Damage_formula

    The attack:defense ratio is similar, but HP is most certainly not. Furthermore, the damage formula takes into account level. Try plugging in a level 5 pokemon to (2 * level + 10)/250 and see how much a 40 base power non-stab move does against pokemon with 300-400 HP. The damage formula is made in a way that keeps in mind the fact that your attacks are far weaker at lower levels and that when pokemon have higher HP, they're also higher levels.
     
    Last edited:
    15
    Posts
    10
    Years
    • Seen Jun 15, 2023
    http://bulbapedia.bulbagarden.net/wiki/Damage#Damage_formula

    The attack:defense ratio is similar, but HP is most certainly not. Furthermore, the damage formula takes into account level. Try plugging in a level 5 pokemon to (2 * level + 10)/250 and see how much a 40 base power non-stab move does against pokemon with 300-400 HP. The damage formula is made in a way that keeps in mind the fact that your attacks are far weaker at lower levels and that when pokemon have higher HP, they're also higher levels.

    I'd forgotten how twisty that stuff is... may require further consideration. Dropping the static level to 50 would be simpler, but would probably only diminish the problem and could create new ones.

    ...hopefully there's documentation on messing with the damage formula. Looks like just changing that [Level] variable to a static 100 might fix the whole problem.
     
    19
    Posts
    8
    Years
  • I made a game pretty much like this, and I made a thread for it about a week ago, the game is really fun, but I'm more into competetive battling than programming, so I haven't gone deep into game coding, but I have changed A LOT, every attack, every Pokemon, everything, it's a much more balanced evnironment than before.
    (sorry for the double post, new to PokeCommunity as well)
     

    Touched

    Resident ASMAGICIAN
    625
    Posts
    9
    Years
    • Age 122
    • Seen Feb 1, 2018
    I'd forgotten how twisty that stuff is... may require further consideration. Dropping the static level to 50 would be simpler, but would probably only diminish the problem and could create new ones.

    ...hopefully there's documentation on messing with the damage formula. Looks like just changing that [Level] variable to a static 100 might fix the whole problem.

    The third byte of the code I gave you is the forced static level. Right now, it's 0x64 (Lv 100), so just drop it to 0x32 for Lv 50. I had forgotten that the damage formula uses level. Should just be a matter of placing 64 20 (mov r0, #100) at both 0x03F3EC and 0x03F290 (FireRed) or 0x069C24 and 0x069AC8 (Emerald). Again, just replace the 0x64 in 64 20 to change the static level. Keep in mind that I have not tested this, so it might not work.

    EDIT: Just tested these in FireRed and it makes the beginning battles more tolerable and the damage ranges for tackle seem more reasonable. Potions are still useless though, and movesets should be updated.
     
    Last edited:
    15
    Posts
    10
    Years
    • Seen Jun 15, 2023
    The third byte of the code I gave you is the forced static level. Right now, it's 0x64 (Lv 100), so just drop it to 0x32 for Lv 50. I had forgotten that the damage formula uses level. Should just be a matter of placing 64 20 (mov r0, #100) at both 0x03F3EC and 0x03F290 (FireRed) or 0x069C24 and 0x069AC8 (Emerald). Again, just replace the 0x64 in 64 20 to change the static level. Keep in mind that I have not tested this, so it might not work.

    EDIT: Just tested these in FireRed and it makes the beginning battles more tolerable and the damage ranges for tackle seem more reasonable. Potions are still useless though, and movesets should be updated.

    Touched you are a saint. I'm curious as to how you're pulling these offsets out so quickly; has this all been documented before, or are you just that good?
     

    Touched

    Resident ASMAGICIAN
    625
    Posts
    9
    Years
    • Age 122
    • Seen Feb 1, 2018
    Touched you are a saint. I'm curious as to how you're pulling these offsets out so quickly; has this all been documented before, or are you just that good?

    Lol thanks. This exact hack wasn't documented, but the surrounding functions were named (by lots of people in the IDB, mostly knizz though). So it takes a few minutes of work in IDA to find the actual code involved: I had to find some of the functions myself (the damage calc) but the rest was labelled. Once you know which function to edit it's easy to find the code you need to patch or hook into. All the documentation is in IDA, searching the forums is generally too slow and tedious.
     

    Touched

    Resident ASMAGICIAN
    625
    Posts
    9
    Years
    • Age 122
    • Seen Feb 1, 2018
    Double post cuz I'm on a roll.

    E0 at 08044697 to enable stat updates for everyone, not just Deoxys (thanks daniilS).

    Insert this routine into free space and hook as instructed to allow EV gains for level 100s:
    Code:
    .align 2
    .thumb
        
    @ 00 4A 10 47 XX + 1 XX XX 08 at 0x021D00 (08021D00 via r2)
    hook_name:
        bl calc_evs
        
        add r1, #0x53
        ldrb r0, [r1]
        lsr r0, r0, #0x1
        strb r0, [r1]
        ldr r2, return
        bx r2
        
    .align 2
    return: .word 0x08021D08 + 1
    
    calc_evs:
        push {r0-r3, lr}
        @ Get the player pokemon
        ldr r0, dp08_ptr    
        ldr r0, [r0]
        ldrb r1, [r0, #0x10]
        mov r0, #0x64
        mul r0, r1
        ldr r1, party_player
        add r0, r1
    
        @ Get the species of the defeated pokemon
        ldr r3, battle_data
        ldr r1, b_attacker_partner
        ldrb r2, [r1]
        mov r1, #0x58
        mul r1, r2
        add r1, r3
        ldr r1, [r1]
    
        @ Gain EVs
        bl ev_yield_calc
        pop {r0-r3, pc}
    
    ev_yield_calc:
        ldr r2, =(0x08043890 + 1)
        bx r2
    
    .align 2
    dp08_ptr: .word 0x02023FE8
    battle_data: .word 0x02023BE4
    b_attacker_partner: .word 0x02023D6D
    party_player: .word 0x02024284
     
    15
    Posts
    10
    Years
    • Seen Jun 15, 2023
    Spoiler:

    Jfc. All that's left is changing the experience formula and filling in the new level-up xp numbers, for each growth pattern and you've basically made the hack entirely by yourself; balancing and such is basically up to each hack author after all. Touched, you truly are a wizard. Only possible thing I could ask for is to include the new offsets for Emerald.

    I absolutely will be throwing this together in one game or the other tonight, and be looking into the Experience formula tonight. May be looking at some of your ASM tutorials as well, as I only understand about half that block of code.
     
    15
    Posts
    10
    Years
    • Seen Jun 15, 2023
    For those interested; finally got the time to try the basics out, and the principle works beautifully so far.

    That said, early game is ludicrously hard; my Torchic stands zero chance of beating May's Mudkip unless I get right in there and EV train it 'til it can. The simplest solution I can think of to solve this is simply giving each starter a neutrally effective but sufficiently powerful move to overcome this obstacle at level 6 or 7, bumping the player up to the point where they can catch other pokemon. 60 BP would probably do it; I'm thinking perhaps Pluck for Torchic, and Covet or Thief for Treecko. Mudkip should be okay, as Tackle's BP is 50 compared to the 40 of Scratch and Pound.
     
    Back
    Top