• Just a reminder that providing specifics on, sharing links to, or naming websites where ROMs can be accessed is against the rules. If your post has any of this information it will be removed.
  • Ever thought it'd be cool to have your art, writing, or challenge runs featured on PokéCommunity? Click here for info - we'd love to spotlight your work!
  • It's time to vote for your favorite Pokémon Battle Revolution protagonist in our new weekly protagonist poll! Click here to cast your vote and let us know which PBR protagonist you like most.
  • 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

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?
https://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:
https://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.
 
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)
 
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:
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 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.
 
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
 
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.
 
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